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

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

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

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Java

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

Q&A

解決済

2回答

13835閲覧

equalsメソッドは、nullを渡されるとなぜ常にfalseを返すのでしょうか?参照値がnull同士のパターンは考えられないのでしょうか?

st-access_91s

総合スコア43

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Java

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

1グッド

3クリップ

投稿2016/02/16 15:02

編集2016/02/23 15:07

equalsメソッドは、nullが渡されたときには、常にfalseを戻すと、著書『Java SE7 Silver問題集』のp112に記載がありましたが、x.equals(y)のパターンでx,yともに参照がnullの場合というのは考えられないのでしょうか?
上記記載は、以下のプログラムをコンパイルするとfalseを返すという結果の解説に含まれていました。

public class Main {
public static void main(String[] args) {
Object a = new Object();
Object b = null;
System.out.println(a.equals(b));
}
}

当初、私はfalseを返す理由は、aは新規に生成されたインスタンスを参照しており、bは参照がnullだからと認識していたのですが、調べたら参照型の初期値はnullとありました。
ということは上記のa.equals(b)はtrueを返すことにならないのでしょうか?

rossi46hiro👍を押しています

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

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

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

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

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

kozuchi

2016/02/16 15:08

参照型変数が初期値のnull 以外の以外の値を持つようになるのは、どういう時だとお考えですか?
st-access_91s

2016/02/21 17:55

予め引数にnull以外の値が入っている時と考えます。
st-access_91s

2016/03/06 07:01

更に調べていく中で、ローカル変数の場合は宣言した時点ではnullは設定されていないことが分かりました。
guest

回答2

0

ベストアンサー

参照型の初期値がnullになるという話は、オブジェクトが持つ参照型の変数の初期値がnullになるという意味です。今aには新たなObjectを生成しているのでnullではありません。たとえば

java

1class Test{ 2 String name; 3}

このようなクラスが存在し、new Test()のように生成した際、この中身のnameの初期値はnullになります。

追記:このようにコードを書き換えてみてください。

java

1public class Main { 2 static Object a; 3 public static void main(String[] args) { 4 Object b = null; 5 System.out.println(a.equals(b)); 6 } 7}

こうすると、aはnullで初期化され、a.equals(b)でNullPointerExceptionになるはずです。

仮にaがnullの状態でa.equals(b)を実行しようとするとNullPointerExceptionが発生します。等しいかどうかを判定する以前に実行すること自体ができないのです。そのため、nullを受け取って起動した場合は無条件でfalseでいいわけです。

ちなみに、Java7以降追加されたObjectsというクラスのequalsメソッドは、引数2つを取って等しいかどうかを返します。これならnull同士を比較した際にtrueを返します。

投稿2016/02/16 15:04

編集2016/02/22 00:09
swordone

総合スコア20651

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

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

st-access_91s

2016/02/21 17:54

ご回答いただきありがとうございます。 つまり、aは参照先の値がnull、bはどこも参照していないnullということでよろしいのでしょうか。 また、aがnullの状態(どこも参照していない状態)では実行できずにfalseになるという解説で、無条件falseの理由が分かりました。
swordone

2016/02/23 16:44 編集

「参照先の値」は何のことを言っているのでしょうか? あと、「実行できずにfalse」ではなく、実行しようとすると例外発生でプログラムが強制終了してしまいます(trueもfalseも返さない)。 判定に入れた時点でaはnullではないので、引数がnullならfalse確定なのです。
st-access_91s

2016/03/06 17:44 編集

返答遅くなりました。 私が書いた「参照先の値」というのは、Object a = new Object();において、aが参照している値のことです。ですが、以下のサイト2つを読んで、初期値nullはインスタンス変数(メソッドの外で定義)では宣言時に設定されるが、ローカル変数(メソッド内でのみ有効)ではインスタンス生成と同時に入る値ではないことが分かりました。 http://mitoroid.com/category/java/java_instance.php http://mitoroid.com/category/java/java_init.php 併せて、 Object a = new Object(); System.out.println(a); を試したら、aのハッシュコード値が出力され、nullが出力されなかったことが確認出来ました。 最初の回答でいただいた追記のコードを実行したら、おっしゃる通りNullPointExceptionになりました。ちなみにNullPointExceptionの下りですが、最初にいただいた回答に”等しいかどうかを判定する以前に実行すること自体ができないのです。そのため、nullを受け取って起動した場合は無条件でfalseでいい”とあり、最新の返答で”「実行できずにfalse」ではなく、実行しようとすると例外発生でプログラムが強制終了してしまいます(trueもfalseも返さない)”とあるのですが、両回答の違いがどこにあるのか教えていただけますか?
swordone

2016/03/06 13:08

newの意味がわかっていないのでしょうか。newでインスタンスを生成して変数に格納しているので、nullにはなりえません。 後半については違いはありません。a.equals(null)で、aがnullなら例外になります。aがnullでないならnullでないものとnullとの比較になるので当然等しくはならず、falseになるのです。「実行できずにfalse」というあなたのコメントがおかしかったので補足したまでです。
guest

0

概念的に考えても、NULLとNULLを比較して、TRUEを返却するのはありえないと思います。
NULLというのは、不確定値を意味しますので、
本来は、不確定値と不確定値を比較なので、
FALSEではなく、不確定NULLが返却されるべきではないかと。

不確定値A,Bがあって、これを比較すると考えると、
不一致のパターンは無限(A=1/B=2, A=1/B=3,...)にありますが、
一致(A=1/B=1, A=2/B=2, ...)するパターンというのは、不一致と比較すると高々知れているので
相対的な数から考えて
FALSE 返却ならば、まあ妥協して納得できますが、
TRUE はありえないのではないかと思います。

まあ、概念的なという観点からで、話が少し脇道にそれましたが。

投稿2016/02/23 04:56

t.oonuma

総合スコア12

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

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

swordone

2016/02/23 05:37

JavaScriptか何かと勘違いしてませんか? Javaではnullは「何もない」状態を表し、booleanにNULLはありません。
maisumakun

2022/10/17 15:07

> 概念的に考えても、NULLとNULLを比較して、TRUEを返却するのはありえないと思います いえ、Javaではnull == nullと二項演算が可能で、結果はtrueです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問