提问人:Ievgeniia Leleka 提问时间:5/24/2023 最后编辑:Ievgeniia Leleka 更新时间:5/28/2023 访问量:110
为什么 ParseException 没有被捕获?
Why ParseException is not caught?
问:
为什么没有被抓到这里?当我输入一个由 4 位以上数字组成的日期时,它只是接受它,但它不应该,因为我将 lenient 设置为 false。当我输入当年的字母时,我得到解析异常,但它没有被捕获。ParseException
年份中位数过多的示例会话:
Enter name:
Ievgeniia Leleka
Enter position:
Programmer
Enter year
20023
Worker{name='Ievgeniia Leleka', position='Programmer', year='20023'}
年份字母示例:
Enter name:
Ievgeniia Leleka
Enter position:
Programmer
Enter year
abc
java.text.ParseException: Unparseable date: "abc"
at java.base/java.text.DateFormat.parse(DateFormat.java:399)
at Main.isThisDateValid(Test.java:12)
at Main.main(Test.java:39)
Worker{name='Ievgeniia Leleka', position='Programmer', year='abc'}
public class Main {
public static boolean isThisDateValid(String dateToValidate, String dateFormat) {
if (dateToValidate == null) {
return false;
}
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
sdf.setLenient(false);
try {
Date date = sdf.parse(dateToValidate);
}
catch (ParseException exc) {
exc.printStackTrace();
return false;
}
return true;
}
答:
0赞
KC Wong
5/24/2023
#1
参见 SimpleDateFormat.parse() 的文档: https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html#parse-java.lang.String-
关键部分是: 分析给定字符串开头的文本以生成日期。该方法不能使用给定字符串的整个文本。
因此,如果输入“1990a”,则不会生成 ParseException,因为 1990 是“yyyy”的有效值。
但是,如果输入“a1990”,它将抛出 ParseException。
您应该在问题中包含您的输入和输出。
一个相关的问题演示如何确保它使用整个字符串:强制 SimpleDateFormat 分析整个字符串
评论
0赞
Stephen C
5/24/2023
实际上,真正的解释是在 javadoc 中:“年份:用于解析,如果模式字母的数量超过 2,则无论位数如何,年份都会按字面解释。从 OP 的示例中可以看出,当日期未解析时,日期的年份中有 5 位数字。
0赞
Anonymous
5/24/2023
@StephenC 问题说的日期由4位以上的数字组成。平心而论,现在代码中的 5 位数字 20223 是我对该表达式的解释。这个回答者似乎将其解释为例如,我认为这不是这个意思,但只有 OP 才能确定。1990a
0赞
Stephen C
5/24/2023
如果这是回答者的解释,那就是字面上的误解。 不是(十进制)数字,传统的日期格式不以十六进制表示年份。现在我承认,OP 在表示字符时也可能说数字,但我们不应该试图读懂 OP 的思想。(或者至少,不是没有陈述我们的假设;例如,“我想你的意思是X..这就是我要回答的。a
0赞
KC Wong
5/25/2023
@StephenC 当我回答时,问题没有示例输入和输出;这就是为什么我说“你应该在问题中包括你的输入和输出。相反,OP 说“当我输入年份的字母时,我 [应该] 得到解析异常,但它没有被捕获”,我认为他在年份输入中添加了一个字母表。
评论
Date
Calendar
SimpleDateFormat
java.time.Year.parse ( input , DateTimeFormatter.ofPattern ( "uuuu" ) )
isThisDateValid(year, "yyyy");
isThisDateValid()
Worker
Worker
if