来自比较器的未处理异常类型ParseException

时间:2018-03-14 11:21:40

标签: java sorting date compiler-errors simpledateformat

我需要对String代表日期的列表进行排序。

我尝试了以下代码:

try {
    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
    Collections.sort(days,
            (s1, s2) -> sdf.parse(s1).compareTo(sdf.parse(s2)));
} catch (ParseException e) {
    e.printStackTrace();
}

但是在Eclipse中,我在sdf.parse(s1)得到了编译时错误:

  

未处理的异常类型ParseException

任何解决方案?

我的输入列表是:

[2016-01-02, 2016-01-03, 2016-01-01]

1 个答案:

答案 0 :(得分:6)

SimpleDateFormat::parse method会抛出一个checked exception,因此您必须在调用该方法的位置捕获它 - 在本例中,在lambda表达式中。

另一个问题是大写Y 代表年份。 Check the javadocYweek year field,并不总是与年份相同。您必须将其更改为小写y

// use lowercase "y" for year
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Collections.sort(days, (s1, s2) -> {
    try {
        return sdf.parse(s1).compareTo(sdf.parse(s2));
    } catch (ParseException e) {
        // what to do when parse fails? just ignore and go on? throw exception?
    }
    return 0; // return something or throw exception?
});

但此代码存在问题:如果发生ParseException,则表示String未包含预期格式的日期(yyyy-MM-dd)。在这种情况下你应该怎么办?忽略它并返回0如上(意味着invalid string is "equal" to any date?)。停止排序并抛出异常?

首先尝试将字符串转换为日期可能会更好(如果找到无效的字符串,您可以决定忽略或停止转换),之后,当您'确保所有元素都是有效日期,您可以对它们进行排序。

Java日期/时间API

当你使用lambdas时,你的Java版本是> = 8,那么为什么不使用new date/time API

假设daysString的集合:

List<LocalDate> sortedDates = days.stream()
    // parse to LocalDate
    .map(LocalDate::parse)
    // sort
    .sorted()
    // get list of LocalDate's
    .collect(Collectors.toList());

在这种情况下,String中的任何无效days都会使此代码抛出异常,并且排序将无法完成。不同之处在于此方法会抛出未经检查的异常,因此您不必像在SimpleDateFormat那样明确地捕获它。

如果您希望对days列表进行排序,只需将LocalDate转换回String

days = days.stream()
    // parse to LocalDate
    .map(LocalDate::parse)
    // sort
    .sorted()
    // convert back to string
    .map(LocalDate::toString)
    // get list of String's
    .collect(Collectors.toList());