开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜