【问题标题】:Lambda type inference infers an exception type not thrown by the lambdaLambda 类型推断推断 lambda 未抛出的异常类型
【发布时间】:2015-02-20 19:04:34
【问题描述】:

代码

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 表达式处理了这个异常(对吗?)。

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

【问题讨论】:

  • 似乎是Eclipse 中的一个错误。 jdk 编译你的代码没有问题。
  • @Holger,这里的结果与 Oracle JDK 1.8.0_31 相同。 Meriton,你检查过 Eclipse 中打开的错误吗?
  • FWIW IntelliJ 没有出现这个问题
  • @beresfordt:afaik,IntelliJ 使用javac,所以它应该表现出相同的行为。只有Eclipse 有自己的编译器。
  • 在 IntelliJ 的编辑器窗口中,您仍然会偶尔发现编译错误,但实际上编译没有问题

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


【解决方案1】:

在 Eclipse 的最新版本(以及 javac、IntelliJ 等)中存在大量关于 lambda 表达式和类型推断的错误。就在今天,我注册了460511、460515 和460517。例如,仅在本期中,就针对 lambda 表达式和异常类型的组合进行了很多修复:

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

作为一般经验法则,如果您在 Eclipse 中使用 Java 8,请升级到最新的 Mars (4.5.0) 里程碑。总是。它会为您省去很多麻烦。

【讨论】:

  • 感谢您的链接。事实上,很多关于这个问题的 cmets 都提到需要执行完整的流分析来确定 lambda 可以抛出的异常。这样的分析确实会发现我的 lambda 并没有抛出 TestException,从而导致 RuntimeException 被推断出来。很高兴听到该错误已在较新版本中得到修复,我们将考虑升级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多