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

Sid*_*Sid 3 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");
Run Code Online (Sandbox Code Playgroud)

此问题的修复包括括号中的三元运算符:

// Works fine
System.out.println("Value=" + (sb != null ? sb.toString() : "Null"));
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

tan*_*ius 8

A +优先级高于a !=.

所以你"(Value="+sb ) != null首先要评估.


Jon*_*eet 5

让我们用破坏的花瓶中的编译器有效的方式来表达表达式:

System.out.println( ("Value" + sb != null) ? sb.toString() : "Null");
Run Code Online (Sandbox Code Playgroud)

现在"Value" + sb永远不会为null,即使sb是null ...所以当sb null时,它正在调用toString()并且正在进行中.