2013-12-12 240 views
0

我已經問的矛盾問題在這裏 Why is this not throwing a NullPointerException?爲什麼拋出空指針異常?

之一但這是不同的類型和行爲我想知道的一個,請看看我的例子如下

package com; 

public class test { 

    public static void main(String[] args) { 
     Abc abc = null; 

     //Scenario 1 
     System.out.println("ERROR HERE " + abc!=null?abc.getS1():""); //This is throwing null pointer exception 

     //Scenario 2 
     String s1 = abc!=null?abc.getS1():""; 
     System.out.println("This is fine " + s1); 
    } 
} 

class Abc { 
    String s1; 

    public String getS1() { 
     return s1; 
    } 

    public void setS1(String s1) { 
     this.s1 = s1; 
    } 


} 

所以在這裏方案2將正常工作,但爲什麼它不工作時,我試圖與其他字符串連接在情景1

+0

由於在第一種情況下對參數println()進行評估的順序,首先對「ERROR HERE」+ abc'進行評估並給出NPE。 –

回答

2

您將需要(用括號)分開它,這樣它的閱讀作爲一個整體單獨聲明

System.out.println("ERROR HERE " + (abc != null ? abc.getS1() : "")); 
+0

適合我,你仍然會得到同樣的錯誤? –

5
"ERROR HERE " + abc!=null?abc.getS1():"" 

相當於

("ERROR HERE " + abc!=null)?abc.getS1():"" 

(它從不計算錯誤和因此你得到NPE)

你的意思是:

"ERROR HERE " + (abc!=null?abc.getS1():"") 
+3

運算符優先級規則如下:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – Tenner

+1

列表中'+'運算符高於三元條件運算符'?:'。 – Tenner

0

爲Eyal和Ross投票+1。

由特納都看到這個問題的答案和評論後,我得出的結論是,

它扔nullPointerException因爲!=操作的優先級比+低。

所以編譯器在調用美國廣播公司類的toString方法,因此ABC它扔nullPointerException

如果我錯了,請糾正我。