Java 中3目運算遇到的一個問題

今天 的寫代碼的過程中遇到了一個問題,問題可以抽象成下面的幾行代碼:

Integer b = null;
Integer a = true ? b : 3;

這個代碼是想把b的null值傳給a,但是不幸的是這個代碼在第2行會拋出一個NullPointerException。
爲什麼會這樣呢?原來是因爲3目表達式的“:”兩邊的數據類型不一樣,一個是Integer的一個是int的,所以這裏的b默認做了個自動拆箱操作就是b.intValue(); 所以當然會拋NullPointerException了。
爲了不拋異常下面的代碼應該寫成這樣:

Integer b = null;
Integer a = true ? b : Integer.valueOf(3);

這樣一來都是Integer相同類型的就不會去做拆箱操作了。
話說回來,其實在抽象代碼的時候就可以看到錯誤提示了:
null不能拿來拆箱
從代碼上就可以看到這個b上有個提示:Null pointer access: This expression of type Integer is null but requires auto-unboxing 這裏把null拿來做拆箱操作了。但是在真實的業務中這個b就有可能不是單單一個null,他如果是個表達式編譯器就看不出來了,所以還是需要多加留心。
另外,在用3目運算符的時候 一定要注意,儘量保證結果的2邊數據類型保持一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章