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

Java 奇怪的空指针异常情况:三元条件运算符不使用字符串连接,java,nullpointerexception,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.t

此问题的解决方案包括括号中的三元运算符:

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

这是怎么可能的?

三元操作绕过null对象上的toString方法,这是导致NullPointerException的原因。

异常是在执行sb.toString()时引起的


在修复中,您在执行之前检查sb是否为null,以便不尝试有问题的调用。

A
+
的值高于A
=


因此,您评估
“(Value=“+sb)!=空的

让我们按照编译器在破碎的花瓶中有效使用的方式来括起表达式:

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

现在
“Value”+sb
将永远不会为空,即使
sb
为空。。。因此,当
sb
为null时,它调用
toString()
并发出砰砰的一声。

我认为问题在于语句的解析方式如下:

System.out.println( ("Value" + sb != null) ? sb.toString() : "Null");
字符串串联运算符(+)的优先级高于三值运算符

由于“Value”+null始终不为null,因此即使sb为null,也将始终调用sb.toString(),因此出现NullPointerException

如果有疑问,请插入括号!即使毫无疑问!:)

System.out.print()的实现方式如下:

System.out.println( ("Value="+sb) != null ? sb.toString() : "Null" );

对于sb=null,
sb.toString()
表示
null.toString()
这会导致NullPointerException

如果它绕过,则不应导致NullPointerException,对吗?如果我误解了您的意思,很抱歉。是的,它从不调用null对象上的toString方法。如果你在一个空对象(sb)上调用一个方法,它会导致一个NullPointerException。这太合乎逻辑了。谢谢@SidCool我刚刚遇到了完全相同的问题,谢谢你已经为我问了这个问题:)
public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
}