1. 程式人生 > >三目運算子下的空指標異常和自動拆裝箱

三目運算子下的空指標異常和自動拆裝箱

這是一段會報空指標異常的程式碼:

Double a=Double.valueOf(1);
Float b=null;
String c="123";
a=c.equals("123")?b:a;
在這個例子裡變數b並不能成功的把null賦值給變數a,而是丟擲了空指標異常

雖然b是Float型別,a是Double型別,但是三目運算子的編譯並不會報錯

雖然編譯不報錯,但是會有警告,說變數b是null但是還要拆箱


使用三目運算子時,如果出現型別不一致,java會使用自動拆裝箱的機制

型別不一致時java會拆箱成基本型別,也就是把Double變成double,Float變成float,然後用valueOf方法進行處理

自動拆裝箱是JDK1.5引入的,由編譯器來支援,上面例子的class檔案反編譯出來的結果是這樣的:

Double a = Double.valueOf(1.0D);
Float b = null;
String c = "123";
a = Double.valueOf(c.equals("123") ?b.floatValue() : a.doubleValue());
變數b拆箱成了b.floatValue(),這也就是空指標異常的來源

雖然有自動拆裝箱,但是直接把Float物件賦值給Double物件,編譯是不能通過的,就像這樣:

Double d=Double.valueOf(1);
Float e=d;//該行編譯不通過