2012-06-13 76 views
3

請幫助我如何在java中的string.equals工作與空值?異常有問題嗎? 三種情況:Java空字符串等於結果

boolean result1,result2, result3; 

    //1st case 
    String string1 = null; 
    String string2 = null; 
    result = string1.equals(string2); 
    //2nd case 
    String string1 = "something"; 
    String string2 = null; 
    result2 = string1.equals(string2); 
    //3rd case 
    String string1 = null; 
    String string2 = "something"; 
    result3 = string1.equals(string2); 

結果的值是什麼?我期望這個值:

result1是真的;
result2是錯誤的;
result3爲false;

+13

你爲什麼不試試? – Chip

+3

我不確定案例2,但案例1和3將觸發一個空異常,因爲您試圖調用一個空對象的方法。 –

+0

你可以嘗試回答你自己的問題。 –

回答

20

如果該實例爲null,則不能使用取消引用(點'。')操作符來訪問實例上的實例變量或調用方法。這樣做會產生一個NullPointerException

通常的做法是使用您知道的非空字符串進行比較。例如,"something".equals(stringThatMayBeNull)

+21

不完全正確。您可以在空引用上調用靜態方法。 –

+0

這很酷,我不知道 – sjr

+0

好吧,這是我需要知道的,謝謝。我將使用空字符串「」而不是空字符串:-) – user1097772

1

您將在例1和例3

你不能叫一個空對象上的任何方法(如equals())得到一個NullPointerException。

1

只要string1爲空,並且您調用equals,那麼這段代碼就會拋出NullPointerException,就像在任何空對象上隱式調用方法的情況一樣。

要檢查字符串是否爲空,請使用==而不是equals

儘管result1result3將不會由於NullPointerExceptions而設置,但result2將爲false(如果您將它運行在其他結果的上下文之外)。

7

實際上,您不能在null變量上使用點運算符來調用非靜態方法。

儘管如此,所有這一切都取決於重寫Object類的equals()方法。在String類的情況,是:

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
      char v1[] = value; 
      char v2[] = anotherString.value; 
      int i = offset; 
      int j = anotherString.offset; 
      while (n-- != 0) { 
       if (v1[i++] != v2[j++]) 
        return false; 
      } 
      return true; 
     } 
    } 
    return false; 
} 

如果您傳遞null作爲參數,無論是「如果」會失敗,返回false;

爲你的情況的替代方案是建立一個方法,你的要求:

public static boolean myEquals(String s1, String s2){ 
    if(s1 == null) 
     return s2 == null; 
    return s1.equals(s2); 
} 
0

爲了防止NPE而比較字符串,如果其中至少有一個可以爲空,使用StringUtils.equals方法是空值安全。

0

我們不能用null運算符,因爲這樣做會導致NullPointerException。因此,我們可以利用我們程序中的try..catch塊。這是解決您的問題的一種非常粗糙的方式,但您會得到期望的輸出。

try { 
    result = string1.equals(string2); 
} catch (NullPointerException ex) { 
    result = string2 == null; //This code will be executed only when string 1 is null 
}