当我运行以下代码时,我会期待一个堆栈跟踪,但看起来它忽略了我的值的错误部分,为什么会发生这种情况?
package test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(final String[] args) {
final String format = "dd-MM-yyyy";
final String value = "07-02-201f";
Date date = null;
final SimpleDateFormat df = new SimpleDateFormat(format);
try {
df.setLenient(false);
date = df.parse(value.toString());
} catch (final ParseException e) {
e.printStackTrace();
}
System.out.println(df.format(date));
}
}
输出结果为:
07-02-0201
答案 0 :(得分:11)
DateFormat.parse的文档(由SimpleDateFormat继承)说:
The method may not use the entire text of the given string.
final String value = "07-02-201f";
在你的情况下(201f)它能够解析有效字符串直到201,这就是为什么它没有给你任何错误。
"投掷"同一方法的部分定义如下:
ParseException - if the beginning of the specified string cannot be parsed
因此,如果您尝试将字符串更改为
final String value = "07-02-f201";
您将获得解析异常,因为无法解析指定字符串的开头。
答案 1 :(得分:4)
您可以查看整个字符串是否按如下方式解析。
ParsePosition position = new ParsePosition(0);
date = df.parse(value, position);
if (position.getIndex() != value.length()) {
throw new ParseException("Remainder not parsed: "
+ value.substring(position.getIndex()));
}
此外,当parse
引发异常时,position
也会产生getErrorIndex()
。
答案 2 :(得分:1)
确认......我还发现“07-02-201”,“07-02-2012是日期”编译。但是,“bar07-02-2011”没有。
从SimpleDateFormat中的代码中,似乎解析终止了发现破坏匹配的非法字符的那一刻。但是,如果已经解析到该点的String有效,则接受它。