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

Fab*_*Fab 0 java sorting compiler-errors date 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();
}
Run Code Online (Sandbox Code Playgroud)

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

未处理的异常类型 ParseException

有解决方案吗

我的输入列表是:

[2016-01-02, 2016-01-03, 2016-01-01]
Run Code Online (Sandbox Code Playgroud)

wth*_*igo 6

SimpleDateFormat::parse方法抛出一个checked异常,所以你必须抓住它在方法调用-在这种情况下,lambda表达式内.

另一个问题是,大写Y不能代表年份.检查javadoc:Y周年字段,它并不总是与年份相同.您必须将其更改为小写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?
});
Run Code Online (Sandbox Code Playgroud)

但是此代码存在问题:如果ParseException发生a ,则表示String不包含预期格式的日期(yyyy-MM-dd).在这种情况下你应该怎么办?忽略它并如上所述返回0(意味着无效字符串与任何日期"相等"?).停止排序并抛出异常?

也许最好先尝试将字符串转换为日期(如果你发现一个无效的字符串,你可以决定忽略或停止转换),就在那之后,当你确定所有元素都是有效日期时,你排序他们.

Java日期/时间API

当您使用lambdas时,您的Java版本> = 8,那么为什么不使用新的日期/时间API

假设这daysString's 的集合:

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

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

days但是,如果您希望对列表进行排序,只需将其转换LocalDateString:

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());
Run Code Online (Sandbox Code Playgroud)