博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Boolean.valueOf()的"BUG": NullPointerException
阅读量:6038 次
发布时间:2019-06-20

本文共 777 字,大约阅读时间需要 2 分钟。

  hot3.png

        JDK中Boolean对象里,Boolean.valueOf在某些情况下会抛java.lang.NullPointerException(以下简称NPE).

        最近在做项目的时候发现一个比较诡异的事情, 有时候用Boolean.valueOf方法会抛NPE.

        DEBUG了一下,发现当入参为null的时候,就会抛NPE.

        写了一个test case, 发现Boolean.valueOf(null)的结果为false,并不会抛NPE.

        下面这段代码不会抛NPE

Boolean.valueOf(null);

        但是......下面的代码就会抛NPE

Boolean b = null;Boolean.valueOf(b)

        好玩吧, 哈哈!

        迷惑了......

        然后查了一下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问题了.

        方法二:自己写一个(重复造轮子).

转载于:https://my.oschina.net/0sbVMw/blog/533294

你可能感兴趣的文章
深度学习博客
查看>>
Android总结篇系列:Android Service
查看>>
Android dumpsys命令的使用
查看>>
Linux Kernel系列一:开篇和Kernel启动概要
查看>>
BZOJ 2756: [SCOI2012]奇怪的游戏 网络流/二分
查看>>
master + worker模式的node多核解决框架——node-cluster
查看>>
Android如何实现超级棒的沉浸式体验
查看>>
使用node打造自己的命令行工具方法教程
查看>>
Express代理中间件问题与解决方案
查看>>
||和&&返回什么?
查看>>
linux在文件中查找指定字符串,然后根据查找结果来做进一步的处理
查看>>
在Oracle中删除所有强制性外键约束
查看>>
【R】R语言使用命令行参数 - [编程技巧(Program Skill)]
查看>>
经典算法题每日演练——第二题 五家共井
查看>>
存储过程中拼接的变量和点的问题
查看>>
ASP.NET那点不为人知的事(一)
查看>>
HTML 表格
查看>>
VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
查看>>
php 未实例化类调用方法的问题
查看>>
我对读计算机软件专业硕士的几点看法
查看>>