0

是否可以抑制 Java 代码中的异常?假设我正在尝试做一些像这样基本的事情:

Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-01")

如果字符串格式不正确,该.parse()方法会抛出异常,因此需要一个 try-catch 块:

try {
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-01")
} catch (ParseExeption e) {
    //Nothing to do here
}

但是,我知道不会抛出异常。有没有办法避免使用 try-catch 块?

4

2 回答 2

2

很不幸的是,不行。您无法隐藏此异常。

由于DateFormat.parsehas throws ParseException,您需要在代码中捕获或throws ParseException为您的方法添加状态。

唯一不需要捕获或添加throws语句以使程序编译的异常是继承的异常RuntimeException

在你的情况下ParseException不继承RuntimeException,所以你需要抓住它或使用throws关键字。

偷偷摸摸的投掷方法

实际上,您可以欺骗 Java 编译器并偷偷抛出检查异常。

这可以通过下一个方法来实现

public static <E extends Throwable> void sneakyThrow(Throwable e) throws E {
    throw (E) e;
}

然后你可以用这个方法包装一个异常

try {
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-01")
} catch (ParseExeption e) {
    sneakyThrow(e);
}

如您所见,它确实需要 try/catch块,但您可以使用lombok库,它会使用 annotation 为您完成所有工作@SneakyThrows

@SneakyThrows
public void myMethod() {
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-01");
}

上面的代码可以编译,但需要使用外部库。

于 2021-06-18T16:09:13.293 回答
1

如果您想在Date2021 年 1 月 1 日对 a 进行硬编码,请不要使用SimpleDateFormat,那么您就不必处理异常了。

Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(2021, Calendar.JANUARY, 1);
Date date = cal.getTime();

在 Java 8+ 中,使用新的 Java Time API:

Date date = Date.from(LocalDate.of(2021, 1, 1)
                               .atStartOfDay(ZoneId.systemDefault())
                               .toInstant());
Date date = Date.from(LocalDate.parse("2021-01-01")
                               .atStartOfDay(ZoneId.systemDefault())
                               .toInstant());
Date date = Date.from(Year.of(2021).atDay(1)
                          .atStartOfDay(ZoneId.systemDefault())
                          .toInstant());
Date date = Date.from(ZonedDateTime.of(2021, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault())
                                   .toInstant());

如果您坚持使用SimpleDateFormat,请断言它不会发生。

Date date;
try {
    date = new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-01");
} catch (ParseException e) {
    throw new AssertionError("Cannot happen: " + e, e);
}
于 2021-06-18T16:24:34.913 回答