我知道检查异常的规则,但我不能完全解决这个难题。为什么第二个方法不编译,而第一个方法编译呢?该错误是“未处理的异常类型异常”上的最后一个抛出语句。我能理解为什么我会得到这个错误,但我不明白为什么第一个方法是可以的,它应该有同样的问题?!
eclipse和intellij都显示了相同的错误。
import java.util.concurrent.Callable;
public class ThrowableWeirdness {
public void doWithMetrics(String name, Runnable runnable) {
try {
runnable.run();
} catch (Throwable e) {
System.out.printf(name + ".failed");
throw e;
}
}
public <RET> RET doWithMetrics(String name, Callable<RET> runnable) {
try {
return runnable.call();
} catch (Throwable e) {
System.out.printf(name + ".failed");
throw e; // Compilation error on this line: unhandled exception
}
}
}你能解释一下这两种方法的区别吗?
发布于 2014-06-13 12:06:22
runnable.run不会抛出任何已检查的Exception,因此不会推断您的try/catch和重新抛出会抛出检查过的任何内容,因此它会编译runnable.call()抛出Exception并被处理,但随后重新抛出。为了在本例中修复编译,必须将throws语句添加到方法声明中。
发布于 2014-06-13 12:12:42
从Java 7开始,编译器检查try块以检查实际上会引发什么例外情况
但是,在Java 7中,您可以在FirstException方法声明中的抛出子句中指定异常类型rethrowException和SecondException。Java 7编译器可以确定语句抛出e所引发的异常一定来自try块,由try块引发的唯一异常可以是FirstException和SecondException。即使catch子句e的异常参数是类型异常,编译器也可以确定它是FirstException或SecondException的实例。
如果将源代码级别设置为1.6,它们都不会编译。
https://stackoverflow.com/questions/24204824
复制相似问题