2015-08-28 58 views
6

我剛剛注意到的好奇心,而不是問題。作爲三元運算符編譯的結果,爲什麼返回null(其中布爾值是預期的)?

我不能寫

public boolean x() { 
    return null; 
} 

或本:

public boolean x() { 
    if (DEBUG) { 
    return true; 
    } else { 
    return null; 
    } 
} 

但我可以寫

public boolean x() { 
    return DEBUG ? true : null; 
} 

這是爲什麼? (看來,如果「其他」分支走向拋出NPE)。

+0

謝謝@Thilo。澄清:問題是,爲什麼三元構造不像其他兩個例子一樣被拒絕? –

+1

@MichaelKay再一次,只是出於好奇心,你是否嘗試過'public boolean x(){if(DEBUG){ return true; } return null; }'? –

+0

可能dupplicate http://stackoverflow.com/questions/978324/java-ternary-immediate-if-evaluation? java8中的 – Jens

回答

10

作爲jls狀態:

類型的條件表達式的確定如下: 如果第二和第三個操作數具有相同的類型(其可以是空型),那麼這就是條件表達式的類型。 如果第二個和第三個操作數中的一個是原始類型T,而另一個的類型是對T應用裝箱轉換(§5.1.7)的結果,則條件表達式的類型爲T.

這意味着Java允許null,因爲它可以被用來生成的Boolean一個實例,其可以是裝箱到boolean(讀有關在JLS部boxing以獲得更多信息)。但由於Boolean實例初始化爲null,因此調用booleanValue()將導致NullPointerException

2

三元操作員發現,你有兩個選擇truenull,所以它必須使用自動裝箱和類型本身(即結果有條件的運算符)作爲Boolean(其依次由return自動再次取消裝箱)。

的確切規則有點複雜,你可以找到他們in the JLS

在運行時,你那麼return值的拆箱過程中得到一個NullPointerException。

0

參見JLS-15.25

的類型的條件表達式的確定如下:...如果所述第二和第三操作數中的一個是空型的,而另一個的類型是引用類型,那麼條件表達式的類型就是那個引用類型。

...

在運行時,條件式的第一個操作數的表達首先計算。如有必要,對結果執行拆箱轉換。

所得布爾值隨後被用於選擇第二或第三操作數的表達式:

...

然後評估選定的操作數表達式,並將結果值轉換爲由上述規則確定的條件表達式的類型。

此轉換可能包括裝箱(§5.1.7)或拆箱(§5.1.8)轉換。

所以 - 基本上 - 你的null被裝箱到Boolean

+0

但另一個不是引用類型。在JLS中閱讀適用於此的規則。 – Thilo

相關問題