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

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

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

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

意見交換

4回答

414閲覧

NullPointerExceptionが発生する理由について

0m0

総合スコア0

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

0グッド

0クリップ

投稿2025/01/30 14:48

知りたいこと

下記のケースで①はNullPointerExceptionにならなくて、
②はNullPointerExceptionなる理由が知りたい、もしくは説明していただきたいです

##状況

Java

1import lombok.Data; 2@Data 3public class Sample { 4 private Integer count; 5} 6--- 7(略) 8 // ① 9 if(sample.getCount() == null){ 10 System.out.println("A"); 11 } 12 13 // ② 14 if(sample.getCount() == 3){ 15 System.out.println("B"); 16 }

上記のようなSampleクラスがあり、
①を実行した場合はNullPointerExceptionになりませんが
②を実行した場合はNullPointerExceptionになります。
右辺が違うだけでなぜ挙動が異なるのでしょうか。

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

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

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

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

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

回答6

#1

jimbe

総合スコア13286

投稿2025/01/30 14:58

確認していませんが、左辺を右辺に合わせて変換( Integer → int )しているのではないでしょうか。

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

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

#2

YT0014

総合スコア1786

投稿2025/01/30 15:18

前提として、sample は正常なインスタンス、countがnullとします。

①は、Integerのまま処理され、null==nullとして、正常に実行。
②は、intへの変換が必要になるので、実際の処理は、

Java

1sample.getCount().intValue() == 3

となるので、null.intValue()となり、NullPointerExceptionが発生。

Integer count は、初期化していない場合、nullとなります。
int countなら、0なんですが。

なお、sampleがnullなら、①②とも、NullPointerExceptionが発生、
sample は正常なインスタンス、countもnull以外なら、①②とも正常に実行、
と、状況が再現されません。

*Javaの仕様の話なので、意見交換にはならないかと。

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

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

#3

shiketa

総合スコア4075

投稿2025/01/31 00:07

編集2025/01/31 00:08

jimbeさん、YT0014さんの「意見」と同じことですが。

Java

1class Hoge { 2 private Integer count; 3 Integer getCount() { return count; } 4 void test() { 5 if( getCount() == null ) { System.out.println("A"); } 6 if( getCount() == 3 ) { System.out.println("B"); } 7 } 8}

コンパイルして、逆コンパイルしてみる。

$ javac Hoge.java $ javap -v Hoge Classfile /C:/tmp/Hoge.class Last modified 2025/01/31; size 627 bytes SHA-256 checksum bf7788640300f7be99d2b9d4efda6ee2d62df1c2b7726a702b9b82a4daae8d0f Compiled from "Hoge.java" ...

件のあたりをみてみる。== nullの部分。

0: aload_0 1: invokevirtual #13 // Method getCount:()Ljava/lang/Integer; 4: ifnonnull 15 7: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream; 10: ldc #23 // String A 12: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

もう一方。== 3の部分。Integer#intValue()を実行する。NPE。

15: aload_0 16: invokevirtual #13 // Method getCount:()Ljava/lang/Integer; 19: invokevirtual #31 // Method java/lang/Integer.intValue:()I 22: iconst_3 23: if_icmpne 34 26: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream; 29: ldc #37 // String B 31: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

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

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

#4

neko_the_shadow

総合スコア2372

投稿2025/01/31 00:56

編集2025/01/31 01:01

②を実行した場合はNullPointerExceptionになります

Java言語の仕様として、Integerとintを==にて比較する場合、intValueを利用して、暗黙的にIntegerをintに変換しようとします。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.7

If p is a value of type int, then boxing conversion converts p into a reference r of class and type Integer, such that r.intValue() == p

つまり、sample.getCount() == 3は、実際にはsample.getCount().intValue() == 3となっています。sample.getCount()nullだと、左辺がnull.intValue()となり、NPEが発生します。

①を実行した場合はNullPointerExceptionになりません

上記のような暗黙の型変換が行われるのは、プリミティブ型との比較を行う場合のみで、nullの場合は暗黙の型変換を行いません。

つまり、sample.getCount()がnullの場合、sample.getCount() == nullnull == nullとなり、とくにNPEが発生しないわけです。

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

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

#5

この回答は、運営により削除されました。

#6

この回答は、運営により削除されました。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問