一個關於Java的裝箱與拆箱的bug

先看如下代碼:

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。

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