[英]Java skip try catch for throwable fuction
我想知道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()
放在try-catch中来摆脱此错误。
在Swift 2错误处理中,有一个选项可以try! someFunction()
try! someFunction()
将编译并执行throwable函数,如果发生错误则崩溃。
Java中是否有类似的方法,所以我不必将所有我知道不会在任何地方的try-catch中引发异常的小任务放到哪里?
并非如此,但是您可以编写一个辅助方法来欺骗编译器,使他们认为未检查的异常是未检查的。 例如:
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在这里所做的一样。
并不是的。
在Java中,通常有两种异常类型-选中(扩展Exception)或未选中(扩展RuntimeException)。
以某种方式处理已检查的异常是强制性的,不这样做就可能导致编译时异常,例如您的情况。 有两种处理方法:
throws
声明。 它是方法声明的一部分,并将处理异常的责任转移给已声明方法的客户端。 如果要模拟您提到的Swift构造,则需要这样的内容:
try {
someFunction()
} catch (Exception e) {
throw new <some runtime exception>
}
这样,您可以“吞下”已检查的异常,停止其传播,而是抛出一个非已检查的运行时异常,该异常不会强制调用者对其进行处理,并且如果发生原始异常,则会导致崩溃。
您无法避免在某些时候处理该异常,因为它已被检查,但是如果将调用重构为一个单独的方法来处理该异常, 则可以避免大量try-catch构造的需要:
public class DateUtils {
private DateUtils() { throw new AssertionError(); }
public static Date parse(String toParse, DateFormat format) {
try {
return format.parse(toParse);
catch (ParseException e) {
// Exception handling code here. Maybe you want to log the error
// somewhere? Then either re-throw as a RuntimeException or return some
// default value.
}
}
}
然后,您将执行以下操作:
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = DateUtils.parse(dateString, format);
Log.i(PF.TAG, date.toString());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.