StringBuffer sb=null;
// Some more logic that conditionally assigns value to the StringBuffer
// Prints Value=null
System.out.println("Value="+sb);
// Throws NullPointerException
System.out.println("Value=" + sb != null ? sb.toString() : "Null");
此问题的解决方法包括括号中的三元运算符:
// Works fine
System.out.println("Value=" + (sb != null ? sb.toString() : "Null"));
这怎么可能?
答案 0 :(得分:8)
+
的{{3}}高于!=
。
因此,您首先评估"(Value="+sb ) != null
。
答案 1 :(得分:5)
让我们在破碎的花瓶中将表达式与编译器有效地结合起来:
System.out.println( ("Value" + sb != null) ? sb.toString() : "Null");
即使"Value" + sb
为空,sb
也永远不会为空...所以当sb
为空时,它正在调用toString()
并且砰的一声。
答案 2 :(得分:4)
我认为问题是该语句正在解析如下:
System.out.println( ("Value="+sb) != null ? sb.toString() : "Null" );
字符串连接运算符(+)的优先级高于三元运算符。
由于“Value”+ null始终不为null,因此即使sb为null,也始终会调用sb.toString(),因此会出现NullPointerException。
如果有疑问 - 括号!即使毫无疑问! :)
答案 3 :(得分:2)
三元操作绕过null对象上的toString方法,这是导致NullPointerException的原因。
答案 4 :(得分:1)
异常是sb.toString()执行时的原因。
在修复程序中,您在执行之前检查sb是否为null,这样就不会尝试进行违规的调用。
答案 5 :(得分:0)
System.out.print()实现如下:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
使用sb = null,sb.toString()
表示null.toString()
会导致您出现NullPointerException