遇到空指针异常时,首先就是要通过异常信息定位是哪个类中的哪行方法出现了空指针的情况。
但如果这行代码中涉及到了多个对象,或者涉及到的对象是从通过其它 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 吧,对代码没有侵入性。