4

平等は対称的であるべきですよね?

Object someObject = new Object();
Object NULL = null;

NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false

2 番目の形式で をスローしない理由は何NullPointerExceptionですか?

4

6 に答える 6

4

最初のケースでは、equals() メソッドは NPE をスローしないため、その引数を作成できません。対称性は equals() メソッドの契約の一部です。

于 2011-07-14T17:59:15.977 に答える
2

平等は確かに理論的な意味で対称であると定義されていますが、存在しないオブジェクト(nullが表すもの)ではまったく定義されていません。

したがって、nullに適用された場合の動作も同様に有効です。それは生きているウサギを返す可能性がありますが、それでも平等の理論的定義と矛盾することはありません。

このような場合、Javaの設計者に代わって、null値でequalsを呼び出すことは、null値で他のメソッドを呼び出すことと一致するため、NullPointerExceptionをスローすることはかなり合理的な実装決定です。

于 2011-07-14T18:03:11.060 に答える
1

null2 番目のケースでは、オブジェクトのメソッドにアクセスしていないためです。バランスが取れていないのは平等の概念ではなく、平等にアクセスする方法です。

于 2011-07-14T17:59:49.543 に答える
0

2番目の例は、Objectおよびequals()メソッドに関する単純なルールの1つに違反しているため、対称性の例ではありません。

null以外の参照値xの場合、x.equals(null)はfalseを返す必要があります。

于 2011-07-14T18:07:54.140 に答える
0

私は行きます

someObject.equals(null);

2 番目のフォームで NullPointerException をスローしない理由は何ですか?

この場合、NullPointerException はスローされません。

ここで、 が呼び出されるオブジェクトが であることは確かequals()ですNOT NULL

于 2011-07-14T18:24:03.557 に答える
0

null ポインターを逆参照していないため、2 番目のビットは NPE をスローしません。値を非値と比較しているため、このコードは false を返します。

equals(null)null 値などはないため、常に false を返します。nullJavaには概念が存在しないため、 オブジェクトもプリミティブも値を持つことはできません。nullなどの参照を比較する理由は、null 参照を表すリテラルですif (obj == null)。Java 言語仕様のセクション 3.10.7を参照してください。つまり、someObjectnull 参照と比較しています。

独自のオブジェクトを作成し、オーバーライドequalsして true を返すこともできますが、それは Object の定義に反します。

于 2011-07-14T18:24:42.983 に答える