24

そのような null オブジェクトで equals メソッドを呼び出すことはできないことを私は知っています:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2))
            {
                System.out.println("NOT WORKING :'(");
            }

しかし、私の場合、2 つのデータベースの 2 つのオブジェクトを比較したいのですが、これら 2 つのオブジェクトは属性 null を持つことができます...

では、2 つの属性を比較する方法は何でしょうか。値が null であるか、入力されているかがわからない場合はどうすればよいでしょうか。

この方法は良いですか?

//WORKING
            String s1 = "test";
            String s2 = "test";
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }

            //WORKING
            String s1 = null;
            String s2 = null;
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }

この場合は機能していないため、わかりません...:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2)|| s1 == s2  )
            {
                System.out.println("NOT WORKING :'''(");
            }
4

9 に答える 9

32

私は通常、equalsWithNullsこの問題を解決するために呼び出した静的ユーティリティ関数を使用します。

class MyUtils {
  public static final boolean equalsWithNulls(Object a, Object b) {
    if (a==b) return true;
    if ((a==null)||(b==null)) return false;
    return a.equals(b);
  }
}

使用法:

if (MyUtils.equalsWithNulls(s1,s2)) {
  // do stuff
}

このアプローチの利点:

  • 単一の関数呼び出しで完全な等価性テストの複雑さをまとめます。これは、これを行うたびに一連の複雑なブール値テストをコードに埋め込むよりもはるかに優れていると思います。その結果、エラーが発生する可能性がはるかに低くなります。
  • コードがより記述的になり、読みやすくなります。
  • メソッド名で null を明示的に言及することで、引数の 1 つまたは両方が null である可能性があることを覚えておく必要があることを読者に伝えます。
  • 最初に (a==b) テストを行いますか (a と b が null ではなく、まったく同じオブジェクトを参照するというかなり一般的なケースで a.equals(b) を呼び出す必要を回避する最適化)
于 2012-06-13T09:22:49.677 に答える
25

equals メソッドを実行する前に、少なくとも 1 つが null でないことを確認する必要があります。

if(s1 == s2 || (s1!=null && s1.equals(s2)))  {
   System.out.println("WORKING :)");
} 

の場合はここでs1==s2動作しnull==nullます。ただし、1 つでも null でない場合は、equals を実行する前に少なくとも s1 を確認する必要があります。

更新: @'bernard paulus' によって編集されたように、Java 7 を使用している場合は、java.util.Objects.equals(Object, Object)を使用できます。

于 2012-06-13T09:21:33.067 に答える
18

使用する別のオプション:

Objects.equals(identification, criteria.getIdentification())

java.util.Objects

このクラスは、オブジェクトを操作するための静的ユーティリティ メソッドで構成されます。これらのユーティリティには、オブジェクトのハッシュ コードを計算し、オブジェクトの文字列を返し、2 つのオブジェクトを比較するための null セーフまたは null 許容メソッドが含まれています。

以降: 1.7

public static boolean equals(Object a, Object b)

引数が互いに等しい場合は true を返し、そうでない場合は false を返します。したがって、両方の引数が null の場合は true が返され、1 つの引数だけが null の場合は false が返されます。それ以外の場合は、最初の引数の equals メソッドを使用して等しいかどうかが判断されます。

于 2016-04-19T10:48:59.383 に答える
5

org.apache.commons.lang の ObjectUtils クラスを使用してみてください

public static boolean equals(java.lang.Object object1,
                         java.lang.Object object2)

APIドキュメントから...

2 つのオブジェクトが等しいかどうかを比較します。一方または両方のオブジェクトが null である可能性があります。

ObjectUtils.equals(null, null) = true

ObjectUtils.equals(null, "") = false

ObjectUtils.equals("", null) = false

ObjectUtils.equals("", "") = true

ObjectUtils.equals(Boolean.TRUE, null) = false

ObjectUtils.equals(Boolean.TRUE, "true") = false

ObjectUtils.equals(Boolean.TRUE, Boolean.TRUE) = true

ObjectUtils.equals(Boolean.TRUE, Boolean.FALSE) = false

于 2012-11-19T23:32:08.593 に答える
3

s1.equals(s2)nullを扱うときに NullPointerException が発生する理由は、s2 が null のためでs1なく、null である s1 で equals メソッドを呼び出そうとしているためです。

次のように修正してみてください。

if(s1 != null && s1.equals(s2){ /*...*/ }

falseまた、s1 が null ではなく、s2 が nullの場合、equals から返されますが、NullPointerException は返されないことに注意してください。

于 2012-06-13T09:21:20.630 に答える
2
        String s1 = null;
        String s2 = null;

        if(s1 != null && s2 != null && s1.equals(s2)) {
            System.out.println("equals");
        } else {
            System.out.println("not equals");
        }
于 2012-06-13T09:21:46.500 に答える
2

2つのオブジェクトを比較していると思います。

だから、このようにする必要があります

if(s1==null & s2 == null)  // both null but equal
   return true;
else if(s1 != null && s2 != null && s1.equals(s2)) // both not null and equal
   return true;
else
   return false;

True - 等しい場合 False - 等しくない場合

于 2012-06-13T09:23:51.940 に答える
1

何かが「null」かどうかを知りたい場合は、次を使用して比較できます。

if(s1==null)

null の場合は true になります。問題、null の String がある場合、equals() メソッドを使用できません。このため、3 番目の部分は機能しません。等しい場合は null ポインターを使用できないためです。

最初にオブジェクトが null かどうかを確認し、null でない場合は equals メソッドを使用する必要があります。

一方、空の文字列を比較したい場合があるので注意してください。この場合、equal("") を使用する必要があります。空の文字列を比較する場合は、次のように最初に空の文字列を配置することをお勧めします。

"".equals(YourStringNotNull);

私の英語で申し訳ありませんが、お役に立てば幸いです。

于 2012-06-13T09:43:17.707 に答える