我想知道在Java中是否有一种方法可以“跳过”可抛出函数的try-catch方法,因为我知道该函数不会抛出异常。
我有一段代码:
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = format.parse(dateString); // <-- Compiler error here
Log.i(PF.TAG, date.toString());我收到编译器错误,说没有处理异常。
错误:(97,30)错误:未报告的异常ParseException;必须捕获或声明为抛出
我可以通过将format.parse()放入试捕获中来消除此错误。
在Swift 2错误处理中,有一个选项可以执行try! someFunction(),如果有错误,它将编译和执行throwable函数并崩溃。
在Java中是否有类似的方法,所以我不需要把所有的小任务都放在我知道不会在尝试捕获中抛出异常的地方?
发布于 2015-11-26 11:23:06
不完全是这样,但您可以编写一个助手方法来欺骗编译器,使其相信选中的异常是未检查的。例如:
public static <T> T uncheck(Callable<T> callable) {
try {
return callable.call();
} catch (Throwable t) {
return rethrow(t);
}
}
@SuppressWarnings("unchecked")
private static <E extends Throwable, T> T rethrow(Throwable t) throws E {
throw (E) t;
}你会像这样使用它:
Date date = uncheck(() -> format.parse(dateString));还可以将选中的异常包装为未检查的异常,就像jOOL所做的这里一样。
发布于 2022-11-05 20:27:18
是的,你可以,但这需要隆布克:
@SneakyThrows(ParseException.class)
Date parseSilently(String date) {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return format.parse(dateString); // No error
}详情请参见文献资料。
发布于 2015-11-26 11:25:30
不怎么有意思。
在Java中,通常有两种类型的异常-选中(扩展异常)或未检查(扩展RuntimeException)。
以某种方式处理检查的异常是强制性的,而不这样做会导致编译时异常,就像在您的例子中一样。处理这些问题的方法有两种:
throws声明。它是方法声明的一部分,并将处理异常的责任转移到已声明方法的客户端。
如果您想模仿您提到的Swift结构,您需要的是这样的内容:
try {
someFunction()
} catch (Exception e) {
throw new <some runtime exception>
}通过这种方式,您可以“吞下”检查过的异常,停止它的传播,而不是抛出一个未经检查的运行时异常,这不会迫使调用方处理它,如果原始异常发生,将导致崩溃。
https://stackoverflow.com/questions/33937250
复制相似问题