奇怪的空指针异常情况:三元条件运算符不使用字符串连接

时间:2010-07-19 09:16:56

标签: java nullpointerexception

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"));

这怎么可能?

6 个答案:

答案 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

相关问题