【问题标题】:Exception when using ?: operator in Java 8 lambda expression在 Java 8 lambda 表达式中使用 ?: 运算符时出现异常
【发布时间】:2014-09-22 09:43:13
【问题描述】:

为什么在 Java 8 lambda 表达式中使用 ?: 运算符时会引发异常?
当我尝试运行以下示例代码时:

import java.util.ArrayList;
import java.util.List;

public class TestClass
{
    public static void main(String[] args)
    {
        List<Foo> foos = new ArrayList<>();
        boolean b = true;
        foos.forEach(foo -> (b ? foo.doSth(1) : foo.doSth(2)));
    }

    @FunctionalInterface
    interface Foo
    {
        public void doSth(int i);
    }
}

我得到以下异常:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
at gui.marksDetection.view.TestClass.main(TestClass.java:8)

当用 for-each-loop 替换 lambda 表达式,或者用 if-else-block 替换 (b ? foo.doSth(1) : foo.doSth(2)) 时,一切正常,所以 ?: + lambda 的组合似乎有问题。但是,Eclipse 不会将其标记为错误。

【问题讨论】:

  • 您的代码无法编译,但 Java 允许您运行它并查看。当谈到编译问题所在时,它会抛出异常。您的问题是语法错误;你的括号太多了。
  • "foo ->" 这是什么在 foos.forEach(foo -> (b ? foo.doSth(1) : foo.doSth(2)));。你能描述一下它代表什么吗?
  • @Nateowami:你的意思是使用 "b ? foo.doSth(1) : foo.doSth(2)" 而不是使用 "(b ? foo.doSth(1) : foo.doSth( 2))" -> 这会引发相同的异常。
  • 是的;虽然这不是唯一的问题,但括号太多是行不通的,而且更难追踪真正的问题。

标签: java exception lambda


【解决方案1】:

三元语句要求单独的部分是表达式而不是非语句

您不能在单独的分支中调用语句。

欲了解更多信息,请参阅Java Language specification section 15.25

【讨论】:

  • 感谢您查找。能否解释一下为什么 Eclipse 不将其标记为错误?
  • 迄今为止,在所有 IDE 中,lambda 功能似乎都有些欠发达。特别是因为您没有对表达式块使用大括号表示法。
【解决方案2】:

你的代码不能用 javac 编译:

不兼容的类型:lambda 表达式中的返回类型错误
缺少返回值

我怀疑这是 eclipse 中的一个错误。

【讨论】:

  • 这不是一个错误。即使我在 netbeans 中也看到了这个错误
  • @pd30 不确定我是否关注您:错误是 Eclipse 不应允许 OP 运行代码,因为它无法编译。 Netbeans 显示一个正常的编译错误。
  • 你的意思是尽管存在编译问题,eclipse 还是能够运行代码?
  • @pd30 我没有 Eclipse,但问题表明代码运行并引发了异常。由于它一开始就不应该编译,因此我得出结论,这是一个 eclipse 错误(Java 8 的 eclipse 中有许多错误,所以这并不奇怪)。
  • @assylias Eclipse 实际上会让您运行无法编译的代码,但是当它到达出现问题的行时会引发异常。 (这不一定是这里发生的事情,但肯定有可能)。
猜你喜欢
  • 1970-01-01
  • 2022-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多