質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3222閲覧

【java】equalsメソッドについて(nullを渡してもNullPointerExceptionが発生しない理由・オーバーライドについて)

moritat-222

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/10/03 09:50

現在、JavaSilverの勉強をしています。equalsメソッドについて、2点わからない点が出てきたため、お教えいただきたく思います。

#疑問点①

java

1Object a = new Object(); 2Object b = null; 3System.out.println(a.equals(b));

というコードを実行した時、NullPointerExceptionが発生するのではなく、falseが返るのはなぜでしょうか。

#考えたこと
Java equalsでnullまたは空文字を比較するサンプルというサイトに、

a.equals(b)のとき、aがnullの場合は、NullPointerExceptionが発生します。

a.equals(b)のとき、aがnullではなくbがnullの場合は、falseを返します。
Java7で追加されたObjects.equals(a,b)は、a,bがnullでもNullPointerExceptionは発生しません。

と書かれていました。

公式ドキュメントのequalsメソッドの項目の解説は以下の通りでした。

イメージ説明

ここからは、nullを参照した時の挙動については触れられていないように思います。

Java equalsでnullまたは空文字を比較するサンプルというサイトで書かれていたことは、実際その通りだと思うのですが、これを確認できる公式ドキュメントなどがあればお教えいただきたく思います。

#疑問点②

Java Silver黒本の解説では

equalsメソッドはObjectクラスに定義されているメソッドで、全てのクラスが持っています。しかし、同値性の確認方法は各クラスで異なるため、equalsメソッドはオーバーライドして使うことを前提としています(3章10問)

と書かれていました。

しかし、別の問題の解説では

java.lang.Objectクラスに定義されているメソッドをインターフェースでデフォルトメソッドとしてオーバーライドすると、コンパイルエラーとなります(7章5問)

と書かれていました。

「equalsメソッドはオーバーライドして使うことを前提としています」というのは「java.lang.Objectクラスに定義されているメソッドをインターフェースでデフォルトメソッドとしてオーバーライドすると、コンパイルエラーとなります」と矛盾するように思うのですが、どう理解すれば良いでしょうか。

java.lang.Objectクラスに定義されているメソッドでも、インターフェースではなくクラスでオーバーライドする分には問題ないということでしょうか。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ここからは、nullを参照した時の挙動については触れられていないように思います。

『null以外の参照値xについて、x.equals(null)はfalseを返します。』と書いてありますね。

「equalsメソッドはオーバーライドして使うことを前提としています」というのは「java.lang.Objectクラスに定義されているメソッドをインターフェースでデフォルトメソッドとしてオーバーライドすると、コンパイルエラーとなります」と矛盾するように思うのですが、どう理解すれば良いでしょうか。

インターフェースを直接実体化することはできないので特に問題は生じません。
実装したクラスがequalsをオーバーライドすれば良いのです。

一般にequalsメソッドはフィールドを比較することがほとんどでしょうから、
インターフェースのデフォルト実装として用意したいケースは非常に稀でしょう。

java.lang.Objectクラスに定義されているメソッドでも、インターフェースではなくクラスでオーバーライドする分には問題ないということでしょうか。

はい、全く問題ありません。

投稿2020/10/03 09:58

LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moritat-222

2020/10/03 14:57

回答ありがとうございます。 「x.equals(null)はfalseを返します」というのを見落としてしまっておりました。 また、equalsメソッド(java.lang.Objectクラスに定義されているメソッド)はクラスでオーバーライドするものであると納得できました。 ありがとうございます。
guest

0

NullPointerExceptionが発生するのではなく、falseが返るのはなぜでしょうか。

ヌルポインターの先を見ようとすると、NullPointerExceptionが発生します。
この場合はbの中身がヌルポインターであることだけを確認するので、例外は発生しません。ヌルポインターであることが分かれば真偽が決まるので、その先を見る必要が無いです。

投稿2020/10/03 10:35

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問