在Java 8 lambda表达式中使用?:运算符时出现异常

在Java 8 lambda表达式中使用?:运算符时出现异常,java,exception,lambda,Java,Exception,Lambda,为什么在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

为什么在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);
    }
}

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

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

不允许在单独的分支中调用语句


有关更多信息,请参见您的代码不使用javac编译:

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


我怀疑这是eclipse中的一个bug。

您的代码无法编译,但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))”->这会引发同样的异常。是的;虽然这不是唯一的问题,但括号太多永远不会奏效,也会使跟踪真正的问题变得更加困难。感谢您的查找。您还可以解释为什么Eclipse没有将其标记为错误吗?到目前为止,所有IDE中的lambda功能似乎都有点不成熟。尤其是因为您没有对表达式块使用大括号表示法。这不是一个bug。即使我在中也看到了这个错误netbeans@pd30不确定我是否了解您的意思:错误在于eclipse不应该允许OP运行代码,因为它不编译。Netbeans显示了一个编译错误,这是正常的。你的意思是尽管存在编译问题,eclipse仍然能够运行代码吗?@pd30我没有eclipse,但问题表明代码运行并引发了异常。因为它本来就不应该编译,所以我断定它是一个eclipse错误(eclipse和Java 8中有很多错误,所以这并不奇怪)。@assylias eclipse实际上会让您运行未编译的代码,但当它到达出现问题的行时,它会抛出一个异常。(这不一定是这里发生的事情,但肯定是一种可能性)。
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
at gui.marksDetection.view.TestClass.main(TestClass.java:8)