关于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问题了.

        方法二:本身写一个(重复造轮子).

相关文章
相关标签/搜索