为什么 ParseException 没有被捕获?

Why ParseException is not caught?

提问人:Ievgeniia Leleka 提问时间:5/24/2023 最后编辑:Ievgeniia Leleka 更新时间:5/28/2023 访问量:110

问:

为什么没有被抓到这里?当我输入一个由 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;
    }

   
Java 验证 try-catch simpledateformat parseexception

评论

2赞 Basil Bourque 5/24/2023
只使用现代的 java.time 类,从不使用 、 、 等。例:DateCalendarSimpleDateFormatjava.time.Year.parse ( input , DateTimeFormatter.ofPattern ( "uuuu" ) )
1赞 Anonymous 5/24/2023
这回答了你的问题吗?SimpleDateFormat 接受未提及的日期格式。也许还有这个和这个
1赞 Stephen C 5/24/2023
FWIW - stackoverflow.com/questions/73985417/...是你找到的最接近这个Q的dups。不幸的是,问题反对票的数量使其成为一个糟糕的重复目标。
1赞 Anonymous 5/24/2023
尝试运行您的代码,我认为您的直接问题出在以下行:.您没有从对 的调用中获取返回值(false 或 true)。无论该方法是否显示日期有效,您的程序都会继续使用用户输入的年份字符串(无论是否有效)创建一个新的日期。所以,是的,如果这是用户输入的年份,你可以有一个由字母组成的年份。你可能想要一些声明吗?isThisDateValid(year, "yyyy");isThisDateValid()WorkerWorkerif
1赞 Ievgeniia Leleka 5/28/2023
非常感谢您的评论!使用了 DateTimeFormatter 和 DateTimeParseException,它现在同时捕获字母和过多的数字。

答:

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 说“当我输入年份的字母时,我 [应该] 得到解析异常,但它没有被捕获”,我认为他在年份输入中添加了一个字母表。