1. 程式人生 > >Java 中3目運算遇到的一個問題

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邊資料型別保持一致