2013-05-19 64 views
2

我搞砸了與下面的代碼能不能在兩個代碼片段區分:NullPointerException異常對空檢查

String Check=null; 

if(Check!=null && Check.isEmpty()){ 
    System.out.println("Get Inside"); 
} 

上面的代碼工作正常,並打印消息。

if(Check==null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

此代碼將拋出NullPointerException.Not能夠區分此代碼請幫助。

+0

記住這個: ==!=!= –

+0

@dirkk其實'=='很好(在它不會引發異常的意義上)。這項檢查不會引發NPE。問題是另一方被評估,然後NPE被拋出。 – Maroun

+0

@MarounMaroun當然,用「這個」我提到了整個陳述。我只是覺得這很明顯,因爲你首先檢查'Check'是否爲null,然後訪問這個元素。 – dirkk

回答

7

&&運營商是短路,它不評估右側,如果沒有必要。在這種情況下,有必要:

if(Check==null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

如果Checknull(這就是這種情況),你會繼續&&後檢查的條件,你會得到Check.isEmpty()。由於Checknull,這就像是NEP的null.isEmpty()

爲什麼?

當兩個表達式,它們之間&&,如果第一個是假的,答案永遠是假的,對方將不檢查,但是當第一個是true,你必須繼續檢查其他方面知道是否所有的表達應評估爲truefalse

但是如果你有:

if(Check!=null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

然後在右側將無法達成,因爲它是多餘的檢查它。你已經得到了false,如果你在右側獲得truefalse,結果將是false,因爲這是一個ANDFALSE & & WHATEVER = FALSE)沒關係。那爲什麼要檢查?

This link可能會幫助你。

(我建議您遵循Java Naming Conventions並使變量以小寫字母開頭)。

+0

謝謝先生!我喜歡你的答案,因爲我對那些片段感到困惑。現在我明白了爲什麼它會拋出錯誤。 –

+0

Your're歡迎我的朋友,我很高興它幫助你,當然你可以接受它,如果你想:) – Maroun

1

&&表示首先評估左側,如果false則表示整個表達式爲false。如果左側是true,它會評估右側。你的情況:

if(Check==null && Check.isEmpty()) 

如果Checknull,未來它計算Check.isEmpty()會拋出NullPointerException

0
if(Check==null && Check.isEmpty()){ 
    System.out.println("get Inside") 
} 

在上述檢查爲空如此這般,並期待下一次的條件是的isEmpty拋出NullPointerException異常。

1
if(Check==null && Check.isEmpty()) 

如果真的檢查等於null中其他條件,你只是說null.isEmpty這ofcourse將導致NullPointerException因爲&&是無關緊要的,毫無意義的,你需要||代替

if(Check==null || Check.isEmpty()){ 
    //no NullPointerException 
    System.out.println("get Inside") 
} 
1

首先讓我告訴你之間的區別logical OR(||) and logical AND(&&)。 當您使用logical OR時,如果第一個表達式是TRUE,the second expression is not evaluated;這意味着如果任何一個表達式爲TRUE,則條件滿足並且流進入循環。但在AND, all the expressions must satisfy to TRUE to satisfy the condition的情況下。如果任何一個表達式評估爲FALSE,則條件不滿足。

另外請記住,我們得到NPE(Null Pointer Exception) when we try to call methods upon variables whose value = null

所以在第一種情況:

檢查=零:第一個條件是假的,沒有進一步的處理邏輯,並返回FALSE,如果一個表達是FALSE。不評估第二個表達式(Check.isEmpty或任何其他)。沒有NPE,因爲我們不在任何空值上調用方法。

第二種情況:

第一條件被滿足,因此第二個條件評估會拋出NPE作爲檢查=零,我們是在一個空值調用方法。

希望你明白!