You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何对象为null时触发NullPointerException?为何&逻辑未终止判断?

哈哈,这俩都是Java新手常踩的经典坑,我给你唠明白:

问题1:为何对象为null时会产生NullPointerException?

首先得搞懂null在Java里的本质——它是个特殊的引用值,意思是这个变量根本没指向任何实际存在的对象实例。就像你攥着一张空白的快递单,上面连收件地址都没有,硬要让快递员去送,这不就乱套了嘛。

当你试图通过一个null引用做这些操作时,JVM就会抛出NullPointerException来给你告警:

  • 调用对象的方法(比如null.toString())
  • 访问对象的实例字段(比如null.username)
  • 把null当数组用(比如null[0])
  • 把null传给要求非null参数的方法(如果方法没做null校验的话)

说白了就是:你想操作一个“不存在的对象”,JVM直接给你报错说“这玩意儿是空的,没法操作!”

问题2:为什么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,提问作者史书恒

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:20:08