2010-07-19 31 views
3
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")); 

这怎么可能?

回答

8

A +!=有更高的precedence

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

+0

在此之后,我感到很沮丧。 – Sid 2010-07-19 09:29:49

+0

@SidCool我刚刚有完全相同的问题,谢谢你已经问我这个问题:) – Nick 2012-09-05 13:19:41

+0

欢迎您,尼克! – Sid 2012-09-06 03:55:05

2

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

+0

如果绕过,那么它应该不会造成一个NullPointerException,对吧?对不起,如果我弄错了。 – Sid 2010-07-19 09:21:50

+1

是的,它从不调用空对象的方法toString。如果您调用空对象(sb)上的方法,则会导致NullPointerException。 – BobTurbo 2010-07-19 09:25:04

+0

在此之后,我感到很沮丧。这非常合乎逻辑。谢谢! – Sid 2010-07-19 09:30:38

1

当sb.toString()被执行时,异常就是原因。

在修复程序中,您检查sb是否为null,然后再执行,以免不正当调用。

5

让我们托架表达的方式,编译器将有效地,在破碎的花瓶:

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

现在"Value" + sb永远不会为空,即使sb是空......所以当sb空,它打电话toString()并砰的一声。

4

我认为这个问题是该语句被解析如下:

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

字符串连接运算符(+)具有heigher优先级比三元运算符。由于“Value”+ null始终不为null,所以即使sb为null,也会始终调用sb.toString(),因此NullPointerException也是如此。

如果有疑问 - 括号!即使没有疑问! :)

+0

+1即使没有疑问:) – Nick 2012-09-05 13:22:18

0

是System.out.print()来实现这样的:

public void print(String s) { 
     if (s == null) { 
      s = "null"; 
     } 
     write(s); 
} 

用SB = NULL,sb.toString()意味着null.toString()导致你的NullPointerException