そのような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 :'''(");
}
私は通常、この問題を解決するために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
}
このアプローチの利点:
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) を使用できます。
使用する別のオプション:
Objects.equals(identification, criteria.getIdentification())
このクラスは、オブジェクトを操作するための静的ユーティリティメソッドで構成されています。これらのユーティリティには、オブジェクトのハッシュコードを計算し、オブジェクトの文字列を返し、2つのオブジェクトを比較するためのnullセーフまたはnullトレラントメソッドが含まれています。
以来:1.7
public static boolean equals(Object a、Object b)
引数が互いに等しい場合はtrueを返し、それ以外の場合はfalseを返します。したがって、両方の引数がnullの場合はtrueが返され、1つの引数がnullの場合はfalseが返されます。それ以外の場合、等価性は最初の引数のequalsメソッドを使用して決定されます。
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
_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は返されません。
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-等しくない場合
String s1 = null;
String s2 = null;
if(s1 != null && s2 != null && s1.equals(s2)) {
System.out.println("equals");
} else {
System.out.println("not equals");
}
何かが「null」かどうかを知りたい場合は、次を使用して比較できます。
if(s1==null)
Nullの場合は、trueと表示されます。問題、nullのStringがある場合、equals()メソッドを使用できません。このため、3番目の部分は機能しません。等しい場合、NULLポインターを使用できないためです。
最初にオブジェクトがnullかどうかを確認し、次にnullでない場合はメソッドequalsを使用します。
一方、空の文字列を比較したい場合があるので注意してください。この場合は、equal( "")を使用する必要があります。空の文字列を比較したい場合は、この方法で空の文字列を最初に置くことをお勧めします。
"".equals(YourStringNotNull);
私の英語で申し訳ありません。
Nullオブジェクトでドット演算子(メソッドまたはオブジェクトのプロパティを呼び出す)を呼び出すと、常に RuntimeExceptionがスローされます(Exceptionはオブジェクトではなくクラスに属しているため、静的メンバーです。
コードのチャンクが機能するのは、||ショートカット演算子です:
String s1 = null;
String s2 = null;
if(s1 == s2 || s1.equals(s2))
it 右側を評価しません左側がtrueの場合。
&&についても同じです。左側がfalseの場合、右側は評価されません。