關於Boolean.valueOf()的"BUG": NullPointerException

        JDK中Boolean對象裏,Boolean.valueOf在某些狀況下會拋java.lang.NullPointerException(如下簡稱NPE).java

        最近在作項目的時候發現一個比較詭異的事情, 有時候用Boolean.valueOf方法會拋NPE.spa

        DEBUG了一下,發現當入參爲null的時候,就會拋NPE.code

        寫了一個test case, 發現Boolean.valueOf(null)的結果爲false,並不會拋NPE.對象

        下面這段代碼不會拋NPE源碼

Boolean.valueOf(null);

        可是......下面的代碼就會拋NPEio

Boolean b = null;
Boolean.valueOf(b)

        好玩吧, 哈哈!class

        迷惑了......test

        而後查了一下Boolean對象的源碼,發現有兩個valueOf的重載方法: 一個方法入參是String類型,另外一個方法入參是boolean類型(你沒看錯,是小寫的b).方法

        因而乎就豁然開朗了: 當入參爲null的時候,它認爲入參是String對象, 因而調用的是String類型的入參的方法,所以會返回false,而不會拋NPE; 可是當入參爲Boolean對象時,自動拆箱,它會調用入參爲boolean的方法,若是對象值爲null,固然就會拋NPE了.項目

        你說它是BUG吧,它說你沒檢查入參是否爲空;你說它不是BUG吧,我入參爲null時居然能跑通......是與不是見仁見智吧.

        解決方法:

        方法一:不用JDK的Boolean.valueOf的方法,而使用Apache common包裏的BooleanUtils.toBoolean()方法替代,就不會出現NPE問題了.

        方法二:本身寫一個(重複造輪子).

相關文章
相關標籤/搜索