代码
class TestException extends Exception {
}
interface Task<E extends Exception> {
void call() throws E;
}
public class TaskPerformer {
/** performs a task in the proper context, rethrowing any exceptions the task declares */
private <E extends Exception> void perform(Task<E> task) throws E {
beforeTask();
try {
task.call();
} finally {
afterTask();
}
}
private void afterTask() {
// implementation elided (does not matter)
}
private void beforeTask() {
// implementation elided (does not matter)
}
public static void main(String[] args) {
new TaskPerformer().perform(() -> { // compilation error
try {
throw new TestException();
} catch (TestException e) {
return;
}
});
}
}
被 eclipse 编译器拒绝并出现错误
Unhandled exception type TestException
在 main 的第一行,即使 lambda 表达式处理了这个异常(对吧?)。
这是编译器错误,还是我忽略了什么?
最佳答案
在 lambda 表达式和类型推断方面,最近发布的 Eclipse(以及 javac、IntelliJ 等)中存在大量错误。就在今天,我注册了460511 , 460515 , 和 460517 .例如,仅在这个问题中,就有不少关于 lambda 表达式和异常类型组合的修复:
我没有遇到你在 Eclipse 4.5.0 M5 中遇到的问题(也没有遇到 javac build 1.8.0_40-ea-b21),所以我敢打赌这是一个错误,它有已修复。
根据一般经验,如果您将 Java 8 与 Eclipse 结合使用,请务必升级到最新的 Mars (4.5.0) 里程碑。总是。它会让您省去很多麻烦。
关于java - Lambda 类型推断推断出 lambda 未抛出的异常类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636387/