【Java初心者向け】NullPointerExceptionとは?原因・対策

【Java初心者向け】NullPointerExceptionとは?原因・対策

無料プログラミングスクール「アキバ・テックドリーム・アカデミー」(以下、テクドリ)の運営企業であるメディアファイブ株式会社に所属する現役エンジニア社員が
「NullPointerException」とは何か、実際のサンプルコードを元に原因と対策について解説します!

目次

    NullPointerExceptionとは

    「NullPointerException」とは、nullというデータが何もない状態のオブジェクトにアクセスしようとした時に発生する例外です。

    Could not retrieve HTML for embedding from https://tech-dream.school/archives/category/study/programming/lang/5116

    NullPointerExceptionが発生する例

    例外が発生しない正常なサンプルコード

    下記のサンプルソースは、変数「sample」に代入された値とその長さを出力するソースコードです。

    このソースコードを実行すると「sample」に代入された値である「あきはばら」と文字列の長さが正常に出力されます。

    public class SampleClass1 {
    
    	public static void main(String[] args) {
    
    		String sample = "あきはばら"; 			// sample に「あきはばら」を代入
    		System.out.println(sample);				// sample の値を出力
    		System.out.println(sample.length());	// sample の値の長さを出力
    	}
    }

    実行結果

    あきはばら
    5

    例外が発生する異常なサンプルコード

    上記の正常なサンプルコードの変数「sample」に、nullを代入した場合、長さを取得するlength()メソッドが、null が代入された「sample」の値の長さを取得しようとし、NullPointerExceptionが発生します。

    nullのオブジェクトにアクセスしたため、この例外が発生します。

    public class SampleClass2 {
    
    	public static void main(String[] args) {
    
    		String sample = null; 					// sample に「null」を代入
    		System.out.println(sample);				// sample の値を出力
    		System.out.println(sample.length());	// sample の値の長さを出力
    	}
    }

    実行結果

    null
    Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "" is null
            at SampleClass2.main(SampleClass2.java:7)

    NullPointerExceptionに対しての対策

    NullPointerExceptionを起こさせない対策として、あらかじめオブジェクトが null でないかをチェックする方法があります。

    前項のサンプルコードを元に解説します。

    対象オブジェクトがnullではない場合のサンプルコード

    オブジェクトにアクセスする前に null でないかのチェックを行います。

    public class SampleClass3 {
    
    	public static void main(String[] args) {
    
    		String sample = "データあり"; 		// sample に「データあり」を代入
    		System.out.println(sample);			// sample の値を出力
    		
    		if (sample != null) {
    			System.out.println(sample.length());		// sample がnull でない時の処理
    														// sample の値の長さを出力	
    		} else {
    			System.out.println("nullが代入されています。");		// sample がnull である時の処理
    																// null を検知した時のメッセージを出力
    		}
    	}
    }

    「if (sample != null) { 」が変数の「sample」がnull かどうかを判定しています。

    null ではない場合は次の行の処理を行います。

    System.out.println(sample.length());

    null の場合、「 } else { 」の次の行の処理を行います。

    System.out.println("nullが代入されています。");

    実行結果

    データあり
    5
    

    データがnull ではない場合、「あきはばら」の後に文字列の長さが出力されています。

    対象オブジェクトがnullの場合のサンプルコード

    「sample」にはnull が代入されていますが、「NullPointerException」を発生させずにnull であるときの処理を実行できます。

    public class SampleClass4 {
    	public static void main(String[] args) {
    
    		String sample = null; 				// sample に「null」を代入
    		System.out.println(sample);			// sample の値を出力
    		
    		if (sample != null) {
    			System.out.println(sample.length());			// sample がnull でない時の処理
    															// sample の値の長さを出力	
    		} else {
    			System.out.println("nullが代入されています。");		// sample がnull である時の処理
    																// null を検知した時のメッセージを出力
    		}
    	}
    }

    実行結果

    null
    nullが代入されています。

    NullPointerExceptionのまとめ

    今回は、プログラミング初心者が最初につまずく例外のひとつ、NullPointerExceptionについて解説しました。

    NullPointerExceptionとは、nullというデータが何もない状態のオブジェクトにアクセスしようとした時に発生する例外です。

    この例外は発生する頻度が高いエラーの一つで初心者の方はもちろん、経験を積んだエンジニアでも起こり得るエラーです。

    エラーの起こった原因と解消法を学んでいき、エラーの少ないプログラミングができるエンジニアを目指しましょう!

    まずは選考会へ!

    「プログラマーになって一緒に働きませんか?」
    テックドリームの選考会は、選考だけでなく「相互理解」の場。不安なことも直接ご相談いただけます。


    電話でのご予約

    Webかんたん予約ができない場合や、ご質問がございましたら、
    お気軽にお電話ください。

    0120-262-242
    9:00~18:00(土日祝を除く)

     

    >テクド・リム

    テクド・リム


    「テックドリーム」の公式キャラクター。
    プログラマーだった父の影響を受けて、
    夢に向かって日々勉強に励むプログラマーのタマゴ。
    夢は「世界を変える、すごいプログラマーになること!」

    CTR IMG