2013-07-29 79 views
9

爲什麼此代碼有效?奇怪的Java行爲。三元運算符

Float testFloat = null; 
Float f = true ? null : 0f; 

爲什麼會拋出異常?

Float testFloat = null; 
Float f = true ? testFloat : 0f; 

但奇怪的是,這種代碼也運行成功,沒有任何例外:

Float testFloat = null; 
Float f = testFloat; 

看來,爪哇三元運營商改變行爲。任何人都可以解釋爲什麼這是嗎?

+0

我用JDK 7u25運行它,它沒有拋出任何異常。 –

+0

第三個代碼不能拋出異常:你聲明一個變量,將其設置爲null,然後聲明另一個變量並將其設置爲第一個爲null的值。沒有例外可以拋出 –

回答

13

的行爲在指定JLS - Conditional Operator

如果第二和第三個操作數中的一個是原始類型T的,並且其他的類型是施加裝箱轉換的結果(§5.1.7)到T,那麼條件表達式的類型是T

強調我的。因此,在2次情況

Float f = true ? testFloat : 0f; 

由於第三操作數是原始類型(T),則表達式的類型將是浮式 - T。所以,拆箱testFloat這也是目前null參考,float將導致NPE


對於1 ST情況下,相關部分是最後一個:

否則,第二和第三操作數分別爲類型S1和S2的。假設T1是將裝箱轉換應用於S1所產生的類型,並讓T2爲將裝箱轉換應用於S2所得到的類型。條件表達式的類型是將捕獲轉換(第5.1.10節)應用於lub(T1,T2)(第15.12.2.7節)的結果。

因此,根據這樣的:

null type - S1 
float  - S2 

null type - T1 (boxing null type gives null type) 
Float  - T2 (float boxed to Float) 

然後條件表達式類型變得 - Float。沒有拆箱的null需要,因此沒有NPE

+0

哦,我現在明白了! Thx你這麼多的答案! – user2452103

+0

我無法找到確切的規則,爲什麼'真? null:0f'沒問題。你能指出JLS中的那個部分嗎?或者僅僅是「如果第二個和第三個操作數具有相同的類型(可能是空類型),那麼這就是條件表達式的類型。」,其中'0f'被裝箱到'Float'? –

+0

@Heuster。讓我看看。 –