2014-09-22 17 views
1

爲什麼在Java 8 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 = 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) 

當與替換lambda表達式一個的for-each環,或具有取代(b ? foo.doSth(1) : foo.doSth(2)) if-else-block,一切正常,所以組合?: + lambda似乎有問題。但是,Eclipse不會將其標記爲錯誤。

+0

您的代碼無法編譯,但Java可以讓您無論如何運行它並查看。當涉及到編譯問題時,它會拋出異常。你的問題是語法錯誤;你有一個太多的括號。 – Nateowami 2014-09-22 09:46:17

+0

「foo - >」foos.forEach是什麼(foo - >(b?foo.doSth(1):foo.doSth(2)));.你能描述一下它的含義嗎? – Ajit 2014-09-22 09:47:08

+0

@Nateowami:你的意思是使用「b?foo.doSth(1):foo.doSth(2)」而不是使用「(b?foo.doSth(1):foo.doSth(2))」 - >這個拋出相同的異常。 – Sebi 2014-09-22 09:54:00

回答

6

的三元語句需要單獨的部分是你不允許調用在單獨的分支語句表達和不聲明

欲瞭解更多信息,請參閱Java Language specification section 15.25

+1

感謝您查閱。你還可以解釋爲什麼Eclipse不會將其標記爲錯誤? – Sebi 2014-09-22 10:00:37

+1

lambda特性在所有IDE中迄今爲止似乎還有點欠發達。特別是因爲你沒有使用大括號表示塊。 – Vogel612 2014-09-22 10:03:34

0

您的代碼不會用javac編譯:

不兼容類型:錯誤的返回類型的lambda表達式
缺少返回值

我懷疑這是日食中的一個錯誤。

+0

這不是bug。即使我在netbeans中看到這個錯誤 – pd30 2014-09-22 10:09:12

+0

@ pd30不知道我關注你:錯誤在於eclipse不應該允許OP運行代碼,因爲它不能編譯。 Netbeans顯示一個正常的編譯錯誤。 – assylias 2014-09-22 10:26:52

+0

你的意思是eclipse能夠運行代碼,儘管事實上存在編譯問題? – pd30 2014-09-22 10:29:21