Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SimpleDataFormat中找出解析异常的实际原因?_Java_Simpledateformat - Fatal编程技术网

Java 如何在SimpleDataFormat中找出解析异常的实际原因?

Java 如何在SimpleDataFormat中找出解析异常的实际原因?,java,simpledateformat,Java,Simpledateformat,我有一个字符串形式的日期,我正在使用SimpleDateFormat验证该日期 我有以下代码: public boolean validateDate(String date) { SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); format.setLenient(false); try { Date dt = format.parse(date); logger

我有一个字符串形式的日期,我正在使用
SimpleDateFormat
验证该日期

我有以下代码:

public boolean validateDate(String date) {

    SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
    format.setLenient(false);
    try {
        Date dt = format.parse(date);
        logger.info("DT:\t" + dt.toString());
        String actDate = format.format(dt);
        logger.info("actDate:\t" + actDate);
        return actDate.equals(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return false;
}
现在,如果我发送一个格式不相同的值(例如29-03--2008),或者一个闰年不正确的值(例如29-02-2007),我会得到一个
java.text.ParseException:不可解析的日期:

我想知道到底是什么导致了这个问题,这样我就可以向调用这个方法的人发送一条合适的消息。但是,当异常发生时,我无法知道到底是什么导致了它(是无效格式还是错误值或其他原因)

我可以使用RegEx检查格式是否正确,但是
SimpleDateFormat
已经在内部处理该检查。所以我不想再做同样的事了


有没有办法让我知道是什么原因导致了异常?

我怀疑有无数种方法可以使日期格式错误。总的来说,如果有足够的时间,我们的代码可能会经历所有这些

您可能会发现最简单(最好?)的方法就是在错误消息中包含格式错误的日期,这样用户就可以看到他们做错了什么

编辑:小心避开输入的值,以免在系统中引入XSS或类似漏洞。

javadoc for
parse
方法,它是这样说的:

解析给定字符串开头的文本以生成日期。 该方法不能使用给定字符串的整个文本

ParseException-如果无法分析指定字符串的开头

一旦发现字符串无法解析,它就会抛出
ParseException
。由于它从不解析完整的字符串(除非在解析最后一个字符时抛出
ParseException
),因此您不知道它失败的确切原因(即它是无效的
格式
还是无效的
日期


最接近它的方法是,通过将
lenient
设置为
false
和不设置
lenient
来解析
date
。如果前者引发异常,但后者正常工作,如果需要知道确切原因,您可以确定它是无效的
date
,而不是
format

,然后您需要编写自己的解析器。您可以使用
setLenient
来确定它是格式问题还是无效日期。
java.time.DateTimeFormatter
java.time
类中的
parse
方法往往会给出更多信息丰富的错误消息。不过,我想我还是不想把这些信息传递给普通用户。这也是
ParseException
通常也会做的事情(包括有问题的文本),例如
java.text.ParseException:Unparseable date:“ABC”
。还要注意
ParseException.getErrorOffset()
,指示字符串中发现第一个错误的位置。它仍然没有您真正想要的那么多信息,因为有太多的方式可以使文本格式错误。