19

Javaのstring.equalsはnull値でどのように機能しますか? 例外に何か問題がありますか?3 つのケース:

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);

結果の値は何ですか? 私はこの値を期待しています:

結果 1 は真です。
結果 2 は偽です。
結果 3 は偽です。

4

9 に答える 9

51

インスタンス変数にアクセスしたり、インスタンスがnull. そうすることで、 が得られますNullPointerException

文字列の比較には、null でないことがわかっているものを使用するのが一般的です。たとえば、"something".equals(stringThatMayBeNull).

于 2012-06-13T03:22:56.510 に答える
12

実際、null変数にドット演算子を使用して非静的メソッドを呼び出すことはできません。

equals()それにもかかわらず、すべてはクラスのメソッドをオーバーライドすることに依存していますObjectStringクラスの場合は次のとおりです。

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と、両方の「if」が失敗し、false;が返されます。

ケースの代替手段は、要件に合わせてメソッドを構築することです。

public static boolean myEquals(String s1, String s2){
    if(s1 == null)
        return s2 == null;
    return s1.equals(s2);
}
于 2012-06-13T03:32:45.683 に答える
3

メソッドが null オブジェクトで暗黙的に呼び出された場合と同様に、このコードはNullPointerExceptionstring1 が null で呼び出されるたびに をスローします。equals

文字列が null かどうかを確認するには、==ではなくを使用しますequals

result1とは NullPointerExceptions のために設定されませんがresult3、result2 は false になります (他の結果のコンテキスト外で実行した場合)。

于 2012-06-13T03:24:18.150 に答える
1

ケース 1 とケース 3 で NullPointerException が発生します。

equals()null オブジェクトに対してメソッド ( など) を呼び出すことはできません。

于 2012-06-13T03:24:04.313 に答える