由於在三元運算符中發生意外的類型轉換,導致前一天真的有點奇怪NullPointerException
。鑑於這種(無用示例性)功能:通過Java三元運算符的自動裝箱行爲發生的NullPointerException
Integer getNumber() {
return null;
}
我期待以下兩個代碼段編譯後爲完全相同:
Integer number;
if (condition) {
number = getNumber();
} else {
number = 0;
}
與
Integer number = (condition) ? getNumber() : 0;
。
事實證明,如果condition
是true
,語句來工作正常的if
,而在第二代碼段中的三元調度研究拋出一個NullPointerException
。看起來好像三元操作決定在將結果自動裝箱回Integer
之前,將兩個選項都輸入到int
!!!實際上,如果我明確地將0
轉換爲Integer
,則例外情況會消失。換句話說:
Integer number = (condition) ? getNumber() : 0;
是不一樣:
Integer number = (condition) ? getNumber() : (Integer) 0;
。
因此,似乎三元運算符和等效的if-else
-statement之間存在字節碼差異(我沒有想到)。這引出了三個問題:爲什麼會有差異?這是三元實現中的錯誤還是有類型轉換的原因?鑑於是有區別的,三元操作是否比等效的if
-statement表現得更高或更低(我知道,差別不大,但仍然)?
你認真地認爲三元運算符存在一個錯誤,而不是你對理解文檔的使用和運算符限制的理解*你認爲這種現實發生的可能性是什麼?考慮將你的問題的標題改爲「誤解三元運營商的工作方式」。 –
這就是爲什麼我問這個問題,爲什麼編譯器決定getNumber()和0應該都計算爲一個int,如果我將結果賦給一個整數。對我而言,在比較之前將兩個參數強加於比較嚴格的兩種類型是完全沒有意義的,而不是比較之後實際需要的類型。爲什麼要拆箱,然後重新裝箱getNumber()? –
您或我認爲應該發生的事情沒有區別。更重要的是JLS中明確記載的內容。 –