Java中Try-Catch捕获异常返回循环起始时出现死循环的问题
代码存在的核心错误
你的代码触发死循环+逻辑异常是多个问题叠加导致的:
- 输入位置错误:读取用户输入的代码写在了
do-while循环外部,循环重试时不会重新读取用户新输入的内容,永远用第一次输入的错误字符串做解析,这是触发死循环的核心原因。 - 变量名冲突/写错:
- 格式化对象和解析后的日期对象都用了
dateStandardFormat作为变量名,会直接触发编译错误; - 读取到的用户输入存在
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
相关产品推荐
相关产品推荐

