当用户以错误的格式输入日期时,我收到空指针异常。
将字符串转换为日期的方法
Date stringToDate(String dateString) {
Date returnDate = null;
if (dateString!= null && dateString.length() > 0 && isValidDate(dateString)) {
returnDate = dateFormat.parse(dateStr);
}
return returnDate;
}
和
boolean isValidDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Pattern datePattern = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}");
Matcher datePatternMatch = datePattern.matcher(date);
boolean datePatternMatchfound = datePatternMatch.matches();
if(date==null){
return false;
} else if(date!=null && date.length()>0){
if(datePatternMatchfound){
sdf.setLenient(false);
sdf.parse(date.trim());
}
return true;
} else {
return false;
}
}
我很想知道......
1)什么应该是有效的日期模式?
2)如果用户输入错误的日期stringToDate方法肯定会失败并抛出空指针异常。如何避免?
真的很感激任何帮助。
答案 0 :(得分:1)
有一件事是你需要在验证方法中更加防守。
在您显示的代码中,您执行此操作:
Matcher datePatternMatch = datePattern.matcher(date);
在检查日期String是否为null之前。 Pattern.matcher(null)
导致NullPointerException。
因此,您需要在if (date != null)
条件块中移动此代码。
除此之外,在使用DateFormat验证之前,我没有看到使用正则表达式验证日期字符串的好处。正则表达式验证不会给你任何额外的好处。
答案 1 :(得分:0)
通过使用Simple date format
类,我们可以验证string
是否为日期。您需要确保将setLenient(false)设置为simple date format
对象。
如果未设置,则通过舍入值最终会出现问题。例如,宽松的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日。
示例代码:
http://www.vijayakumarg.co.in/2014/04/how-to-validate-date-string-in-java.html
public static boolean validateJavaDate(String strDate)
{
/*
* Set preferred date format,
* For example MM-dd-yyyy, MM.dd.yyyy,dd.MM.yyyy etc.*/
SimpleDateFormat sdfrmt = new SimpleDateFormat("MM/dd/yyyy");
sdfrmt.setLenient(false);
/* Create Date object */
Date javaDate = null;
/* parse the string into date form */
try
{
javaDate = sdfrmt.parse(strDate);
System.out.println("Date after validation: " + javaDate);
}
/* Date format is invalid */
catch (ParseException e)
{
System.out.println("The date you provided is in an " +"invalid date format.");
return false;
}
/* Return 'true' - since date is in valid format */
return true;
}