web-dev-qa-db-ja.com

Java null.equals(object o)

そのような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 :'''(");
            }
23
Sarah Taylor

私は通常、この問題を解決するために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
}

このアプローチの利点:

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

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

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

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

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

25
Kshitij

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

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メソッドを使用して決定されます。

15
Justas

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

5
Simon

_s1_がnullでs1.equals(s2)を実行するときにNullPointerExceptionが発生する理由は、s-2がnullであるため、notですが、equalsメソッドを呼び出そうとしているためですs1ではnullです。

このように修正してみてください:

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

また、s1がnullでなく、s2がnullの場合、equalsからfalseが返されますが、NullPointerExceptionは返されません。

3
Miquel

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-等しくない場合

2
Subir Kumar Sao
        String s1 = null;
        String s2 = null;

        if(s1 != null && s2 != null && s1.equals(s2)) {
            System.out.println("equals");
        } else {
            System.out.println("not equals");
        }
2
alaster

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

if(s1==null)

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

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

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

"".equals(YourStringNotNull);

私の英語で申し訳ありません。

1

Nullオブジェクトでドット演算子(メソッドまたはオブジェクトのプロパティを呼び出す)を呼び出すと、常に RuntimeExceptionがスローされます(Exceptionはオブジェクトではなくクラスに属しているため、静的メンバーです。

コードのチャンクが機能するのは、||ショートカット演算子です:

 String s1 = null;
 String s2 = null;
 if(s1 == s2 || s1.equals(s2))

it 右側を評価しません左側がtrueの場合。

&&についても同じです。左側がfalseの場合、右側は評価されません。

0
DayaMoon