2010-07-19 63 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