Javaでは、nullチェックを行うとき、.equals()の代わりに==を使用する必要があると言われています。この理由は何ですか?
それらは2つのまったく異なるものです。 ==
は、変数に含まれるオブジェクト参照(存在する場合)を比較します。 .equals()
は、2つのオブジェクトがequalであるかどうかをチェックします。これらのオブジェクトは、等式の意味についての契約に従います。 2つの異なるオブジェクトインスタンスが、契約に従って「等しい」ことは完全に可能です。そして、equals
はメソッドであるため、null
参照で呼び出そうとすると、NullPointerException
を取得するという詳細があります。
例えば:
class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */
}
Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances
System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition
Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it
System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything
System.out.println(f1.equals(f3));
// Outputs false, since `f1` is a valid instance but `f3` is null,
// so one of the first checks inside the `Foo#equals` method will
// disallow the equality because it sees that `other` == null
null
で.equals()
を呼び出すと、NullPointerException
が取得されます
そのため、適用される場合は常にメソッドを呼び出す前にnullityをチェックすることをお勧めします
if(str!=null && str.equals("hi")){
//str contains hi
}
参照
Javaでは、0またはnullは単純型であり、オブジェクトではありません。
メソッドequals()は、単純型用に構築されていません。単純型は==と一致させることができます。
受け入れられた答えに加えて( https://stackoverflow.com/a/4501084/6276704 ):
Java 1.7以降、nullの可能性がある2つのオブジェクトを比較する場合、この関数をお勧めします。
Objects.equals(onePossibleNull, twoPossibleNull)
Java.util.Objects
このクラスは、オブジェクトを操作するための静的ユーティリティメソッドで構成されます。これらのユーティリティには、オブジェクトのハッシュコードを計算し、オブジェクトの文字列を返し、2つのオブジェクトを比較するためのnullセーフまたはnull許容メソッドが含まれています。
から:1.7
foo.equals(null)
Fooがnullの場合はどうなりますか?
NullPointerExceptionが発生します。
Object変数がnullの場合、equals()メソッドを呼び出すことができないため、nullのオブジェクト参照チェックが適切です。
Nullオブジェクト参照でequalsを呼び出そうとすると、nullポインター例外がスローされます。
=> .equalsメソッドを使用する場合
if(obj.equals(null))
// Which mean null.equals(null) when obj will be null.
Objがnullになると、Null Point Exceptionがスローされます。
==を使用する必要があります
if(obj == null)
参照を比較します。
sources によると、デフォルトのメソッド実装に何を使用してもかまいません。
public boolean equals(Object object) {
return this == object;
}
ただし、カスタムクラスのequals
について確認することはできません。
EqualはObjectクラスから派生した関数であるため、この関数はクラスのアイテムを比較します。 nullで使用すると、クラスのコンテンツがnullではないため、falseを返します。さらに、==はオブジェクトへの参照を比較します。
以下は、str != null
を使用するときにorg.json
がstr.equals(null)
である例です。
JSONObject jsonObj = new JSONObject("{field :null}");
Object field = jsonObj.get("field");
System.out.println(field != null); // => true
System.out.println( field.equals(null)); //=> true
System.out.println( field.getClass()); // => org.json.JSONObject$Null
EDIT:ここに org.json.JSONObject $ Null クラスがあります:
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/
private static final class Null {
/**
* A Null object is equal to the null value and to itself.
*
* @param object
* An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object or
* null.
*/
@Override
public boolean equals(Object object) {
return object == null || object == this;
}
}
だから私は決して混乱しないし、このソリューションの問題を回避します:
if(str.trim().length() <=0 ) {
// is null !
}
昨夜この事件に遭遇しました。
単純に次のことを決定します。
存在しないequals()method for null
したがって、invokeが存在しない場合、存在しないメソッドはできません。
->>>これが==を使用してnullをチェックする理由です。