为何对象为null时触发NullPointerException?为何&逻辑未终止判断?
哈哈,这俩都是Java新手常踩的经典坑,我给你唠明白:
首先得搞懂null在Java里的本质——它是个特殊的引用值,意思是这个变量根本没指向任何实际存在的对象实例。就像你攥着一张空白的快递单,上面连收件地址都没有,硬要让快递员去送,这不就乱套了嘛。
当你试图通过一个null引用做这些操作时,JVM就会抛出NullPointerException来给你告警:
- 调用对象的方法(比如
null.toString()) - 访问对象的实例字段(比如
null.username) - 把
null当数组用(比如null[0]) - 把
null传给要求非null参数的方法(如果方法没做null校验的话)
说白了就是:你想操作一个“不存在的对象”,JVM直接给你报错说“这玩意儿是空的,没法操作!”
if(object != null && object.string.equals(""))还会抛NPE? 先给你拍板:如果你的代码真的用的是&&(短路与运算符),那当object != null为false时,第二个条件绝对不会执行,根本不可能抛出NPE。所以你遇到这个问题,99%是把&&写成了&(逻辑与运算符)!
得把这俩运算符的区别掰扯清楚:
&&:短路与——只要第一个条件是false,整个表达式的结果已经确定是false了,直接跳过第二个条件的执行,这就是“短路”的核心意思。&:逻辑与——不管第一个条件是true还是false,都会老老实实执行第二个条件,再判断整体结果。
所以如果你的代码里是object != null & object.string.equals(""),当object为null时,第一个条件是false,但还是会执行第二个条件object.string.equals(""),这时候访问null的string字段,可不就触发NPE了嘛。
当然还有一种极小的特殊情况:如果object != null这个判断本身就会触发NPE?比如object是某个嵌套引用的一部分(比如obj.innerObj != null),但如果obj本身是null的话,那obj.innerObj会先抛NPE,但你这里的判断是直接object != null,所以这种情况基本可以排除。
总结下来,就是你误用了非短路的逻辑与&,代替了短路与&&。
内容的提问来源于stack exchange,提问作者史书恒

