先看如下代碼:
public class TestBoxing {
public static void main(String[] args) {
int result = getProp("hello", new IPropGetter<Integer>() {
@Override
public Integer getProp(BleDeviceProp prop) {
// TODO Auto-generated method stub
return prop.id;
}
});
System.out.println(result);
}
private static <T> T getProp(String mac, IPropGetter<T> getter) {
return null;
}
private interface IPropGetter<T> {
T getProp(BleDeviceProp prop);
}
private static class BleDeviceProp {
int id;
}
}
這段代碼會崩潰,日誌如下:
Exception in thread “main” java.lang.NullPointerException
at fdsa.TestBoxing.main(TestBoxing.java:9)
原因在於Integer轉換成int的過程中會調用Integer.intValue(),而getProp返回的Integer是null,所以導致了崩潰。之所以沒注意到這個問題可能是因爲按C語言的習慣,null和0是一回事,所以轉換不會出現問題,而在Java中null是一個對象,轉換成int要拆箱。
這個bug的解決方案如下:
private static <T> T getProp(String mac, IPropGetter<T> getter, T defaultValue) {
return defaultValue;
}
原先返回null的現在返回一個默認值,如果默認值傳入的是int型的0,則在getProp中會自動通過Integer.valueOf(0)轉換成Integer對象,返回時再將Integer對象拆箱成int型的0。