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

关于在if语句中使用equals()进行空值校验时出现NullPointerException的疑问

为什么obj.toString().equals(null)会抛NPE而不是返回true?

嘿,这个问题的核心是你对Java代码执行顺序和null对象的方法调用规则理解有点小偏差,我来给你掰明白~

首先先确认第一个例子的逻辑是对的:

Object obj;
if (obj.toString().equals("string"))

这里obj是未初始化的局部变量,默认值为null。当你试图在null对象上调用任何实例方法(比如toString())时,JVM会直接抛出NullPointerException,这完全符合预期,你这部分的理解没问题。

那重点来看第二个让你困惑的例子:

Object obj;
if (obj.toString().equals(null))

你以为这里是“把obj和null做比较”,但实际上代码的执行顺序是从左到右、先执行方法调用再执行后续逻辑:

  1. 第一步:尝试执行obj.toString()——但obj是null,这一步直接触发NPE,程序在这里就中断了
  2. 第二步:根本轮不到调用equals(null),因为第一步已经抛出异常了

换句话说,不管你equals的参数是null还是其他值,只要前面的obj.toString()是在null对象上调用方法,整个语句的第一步就会炸,完全到不了比较的环节。

那如果我想实现类似的判断该怎么写?

如果你是想判断obj本身是否为null,直接写if (obj == null)就可以,简单直接。

如果你是想判断obj的字符串表示是否等于某个值(包括避免NPE的情况),推荐把常量字符串放在前面,比如:

if ("string".equals(obj))

这样即使obj是null,equals方法会直接返回false,而不会抛出异常。

另外补充一点:假设我们能走到equals(null)这一步(比如obj不是null),那么这个调用会返回false——因为Java中任何非null对象和null比较都不相等,这是Object.equals()方法的默认规则。

内容的提问来源于stack exchange,提问作者FARS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:57:33