Java System.out.println(xxx == null) 中隐藏的一个坑

本文探讨如何通过巧妙使用打印语句判断空指针问题,以及理解对象相加背后的逻辑,避免混淆结果。建议优先采用debug,但有时偷懒的小技巧也能提供临时解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到空指针异常时,首先就是要通过异常信息定位是哪个类中的哪行方法出现了空指针的情况。
但如果这行代码中涉及到了多个对象,或者涉及到的对象是从通过其它 API 获得的,那我们就要进一步进行判断了。
进一步判断的方法, debug 肯定是最合适的了。
但有的时候我们可能也会偷懒,用打印语句判断对象是否为空。
就像下面这样:

        User user = null;
        System.out.println(user == null);

这样输出的结果就是 true 或 false 了。
上面这行代码会输出正确的结果( true )。

控制台输出的信息可能很多,再加上可能还会打印异常的堆跟踪信息,就这么一个 true 或者是 false 很容易被淹没其中。
于是,骚操作来了:

        System.out.println("用户是否为空:" + user == null);

此时输出的结果会是 false 。
大家应该都知道,字符串可以和其它对象相加,相加的结果是会得到一个新的字符串,这个新的字符串就是这个字符串和对象相加的结果。
如果相加的结果不是 null 的话,应该是调用了对象的 toString 方法;
如果对象为 null ,那应该就会直接加一个字符串 null 了。
当然字符串和基本数据类型相加也是可以的。
所以上面的代码等于是在判断 “用户是否为空:” + user 是否为空,那当然就不为空了。
解决的办法就是要么不要在前面加字符串,要么把它们拆成两个打印语句,要么用三元运算符等等。
最好还是用 debug 吧,对代码没有侵入性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值