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問題了.
方法二:本身寫一個(重複造輪子).