You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Try-Catch捕获异常返回循环起始时出现死循环的问题

代码存在的核心错误

你的代码触发死循环+逻辑异常是多个问题叠加导致的:

  • 输入位置错误:读取用户输入的代码写在了do-while循环外部,循环重试时不会重新读取用户新输入的内容,永远用第一次输入的错误字符串做解析,这是触发死循环的核心原因。
  • 变量名冲突/写错:
    1. 格式化对象和解析后的日期对象都用了dateStandardFormat作为变量名,会直接触发编译错误;
    2. 读取到的用户输入存在date变量里,但调用parse方法时传入的是未正确赋值的datum变量,根本没有使用用户实际输入的内容。
  • 循环标记逻辑完全颠倒:validity作为「日期是否合法」的标记,解析成功时应该设为true终止循环,解析失败时应该设为false让循环继续。你在解析失败的catch块里把validity设为true,且没有给validity设置初始值,逻辑完全混乱。
  • 日期格式模板错误:SimpleDateFormat中mm代表分钟,月份对应的格式符是大写MM,你写的dd.mm.yyyy模板本身就是错的,即使用户输入正确格式的日期也可能解析异常。
修正后的可运行代码
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Scanner;

public class DateInputTest {
    public static void main(String[] args) {
        Scanner eingabe = new Scanner(System.in);
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
        // 开启严格解析,避免32.01.2024这类非法日期被自动转成01.02.2024
        dateFormat.setLenient(false);
        Date parsedDate = null;
        boolean validity = false;

        do {
            System.out.print("Enter date (Format DD.MM.YYYY): ");
            // 输入逻辑放到循环内,每次重试都读取用户新输入的内容
            String inputDate = eingabe.next();
            try {
                parsedDate = dateFormat.parse(inputDate);
                // 解析成功,标记为合法,终止循环
                validity = true;
            } catch (ParseException e) {
                System.out.println("date invalid! Please enter the date in Format DD.MM.YYYY");
                // 解析失败,标记为不合法,继续循环
                validity = false;
            }
        } while (!validity);

        System.out.println("输入的合法日期为:" + parsedDate);
        eingabe.close();
    }
}

注:如果使用JDK8及以上版本,更推荐用java.time.LocalDate和DateTimeFormatter替代老旧的SimpleDateFormat,线程安全且API设计更合理,不会出现格式符混淆的低级问题。

内容的提问来源于stack exchange,提问作者PizzaE4ter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:48:24