天天看點

java條件運算符,三目運算符:類型轉換導緻的錯誤

[align=right]【本博原創文章】[/align]

今天在調試代碼時,發現這樣一個錯誤,感覺挺有意思,跟想象中的結果不太一樣。拿出來大家看看,大家是否一時也未發現錯誤原因?

代碼1:

String flag = "XXX";
Boolean expected = "false".equals(flag) ? false :("true".equals(flag) ? true : null);
           

代碼1 會抛個NullPointerException。

代碼2:

String flag = "XXX";
Boolean expected = "false".equals(flag) ? Boolean.FALSE :("true".equals(flag) ? Boolean.TRUE : null);
           

代碼2 則正常執行。

代碼3:

Boolean c = null;
boolean b = c;
           

代碼3運作會報個NullPointerException,據此得出一個基本事實,給基本布爾類型變量賦null值,是會抛空指針異常的。

仍有疑惑的朋友,請往下看:

條件表達式基本格式為: 邏輯運算表達式?表達式1:表達式2;

“邏輯運算表達式”傳回一個布爾值,即true 或 false, 然後根據布爾值,傳回表達式1或表達式2的值,在表達式1和表達式2計算值的過程中,有類型轉換的過程,即,如果表達式1的類型是Boolean,表達式2類型是boolean,表達式2的值可以被轉成Boolean。

為友善講解,将代碼1的條件運算語句表示為Boolean expected = A ? B : (C ? D : E);代碼1運算過程是這樣的,先計算A值,如果A是true, 則計算并傳回B值;如果A是false,則計算傳回(C ? D : E)值。代碼1因為A是false,是以會去計算(C ? D : E)的值,因為B是boolean,是以(C ? D : E)的值也應該傳回boolean值,這兒可以看作将(C ? D : E)傳回值存放于一個boolean的臨時變量x裡,因為傳回的是null,将null賦給boolean臨時變量x,是以就NullPointerException異常了。

好了,分析了代碼1,那麼代碼2為什麼是正确的,相信就不難了解了。

以上問題主要分析了java條件表達式的詳細運算過程以及其中的表達式類型轉換,進而,加深了對一些基本知識的了解,避免犯一些看似低級的錯誤。

結束了,針對此問題,粘上一些相關代碼,供參考:

代碼4:

String flag = "XXX";
Boolean expected = "XXX".equals(flag) ? ("true".equals(flag) ? true : null)
				: false;
           

代碼4抛空指針異常。

代碼5:

String flag = "XXX";
Boolean expected = "XXX".equals(flag) ? ("true".equals(flag) ? true : null)
				: Boolean.FALSE;
		System.out.print(expected);
           

代碼5正常執行,列印出null。