Lambda类型推断推断出lambda不抛出的异常类型

时间:2015-02-20 19:04:35

标签: java eclipse lambda java-8 type-inference

代码

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编译器拒绝

  

未处理的异常类型TestException

在main的第一行,即使lambda表达式处理此异常(对吗?)。

这是编译器错误,还是我忽略了什么?

1 个答案:

答案 0 :(得分:5)

最近发布的Eclipse(以及javac,IntelliJ等)中有关于lambda表达式和类型推断的大量错误。就在今天,我已注册460511460515460517。例如,仅在这个问题上就lambda表达式和异常类型的组合进行了很多修复:

我没有遇到您在Eclipse 4.5.0 M5中遇到的问题(也没有使用javac build 1.8.0_40-ea-b21),所以我打赌这是一个错误,它已被修复。

作为一般经验法则,如果您在Eclipse中使用Java 8,请升级到最新的Mars(4.5.0)里程碑。总是。它可以为您节省数十个令人头疼的问题。