Strange Null pointer exception case: ternary conditional operator not working with string concatenation
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");
The fix for this issue is encompassing the ternary operator in brackets:
// Works fine
System.out.println("Value=" + (sb != null ? sb.toString() : "Null"));
How 开发者_StackOverflow中文版is this possible?
A +
has a higher precedence than a !=
.
So you evalutate "(Value="+sb ) != null
at first.
Let's bracket the expression the way that the compiler effectively would, in the broken vase:
System.out.println( ("Value" + sb != null) ? sb.toString() : "Null");
Now "Value" + sb
will never be null even if sb
is null... so when sb
is null, it's calling toString()
and going bang.
I think the issue is that the statement is being parsed like this:
System.out.println( ("Value="+sb) != null ? sb.toString() : "Null" );
The string concatenation operator (+) has a heigher precedence than the ternary operator.
Since "Value"+null is always not null, sb.toString() will always be called, even if sb is null, hence the NullPointerException.
If in doubt - parenthesize! Even if not in doubt! :)
The ternary operation bypasses the toString method on the null object, which is what is causing the NullPointerException.
the exception is cause when sb.toString() gets executed.
In the fix you check if sb is null before executing so the offending call is not attempted.
System.out.print() is implemented like that:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
With sb = null, sb.toString()
means null.toString()
which leads to you NullPointerException
精彩评论