Java

Javaでよく発生する例外:NullPointerException と ArrayIndexOutOfBoundsException の原因と予防法

勉強ちゃん

Java Web開発をする際に、NullPointerException 、 ArrayIndexOutOfBoundsException という例外はよく発生します。

その原因と予防策をまとめます。


1. NullPointerException

原因

参照しているオブジェクトが nullです。
つまり、参照しているオブジェクトがまだ初期化されていない、または値が null に設定されてしまっているケースです。

例えば(4行目でNullPointerExceptionが発生しました)

public class Test {
    public static void main(String[] args) {
        Student student = new Student( null);
        System.out.println(student.getName().replace(" ", ""));//空白スペースを除いて、出力
    }
}

class Student {
    private String name ;
    Student(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }

}

予防策

nullチェックを行う

オブジェクトを使用する前に
if (object != null) のような条件分岐でnullでない ことを確認します。
(4行目でnull判定処理を追加)

public class Test {
    public static void main(String[] args) {
        Student student = new Student( null);
        if(student.getName() != null){
            System.out.println(student.getName().replace(" ", ""));//空白スペースを除いて、出力
        }
    }
}

class Student {
    private String name ;
    Student(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }

}

代入時にnullをいれないように制御する

「ここではnullになるはずがない」という場所でも、代入前にnull判定を加え、もしnullなら明示的に例外をスローします。
(22~24行目を判定処理を入れて、nullの場合、例外をスローし、8~12行目に特定のエラーを処理します)

public class Test {
    public static void main(String[] args) {
        try{
            Student student = new Student( null);
            if(student.getName() != null){
                System.out.println(student.getName().replace(" ", ""));//空白スペースを除いて、出力
            }
        }catch(Exception e){
            //エラーの原因を特定するログを出力
            if("名称がnullです".equals(e.getMessage()))
            System.out.println("特定のエラーが発生しました");
        }
    }
}

class Student {
    private String name ;
    Student(String name){
        this.name = name;
    }
    public String getName() throws Exception{
        if( name == null){
            throw new Exception("名称がnullです");
        }
        return this.name;
    }

}

2. ArrayIndexOutOfBoundsException(配列範囲外アクセス)

原因

配列のインデックスが有効範囲外になったときに発生します。
たとえば、配列の要素数を4と想定してアクセスしたが、実際には3しかないです。

例えば(4行目でArrayIndexOutOfBoundsExceptionが発生しました)

public class Test {
    public static void main(String[] args) {
        String[] array = new String[]{"リンゴ","バナナ","みかん"};
        System.out.println(array[3]);
        
    }
}

予防策

配列サイズを事前にチェックする

配列を操作する前に lengthを確認して、アクセスするインデックスが有効範囲内であることを確かめます。
(4行目でサイズの判定処理を追加)

public class Test {
    public static void main(String[] args) {
        String[] array = new String[]{"リンゴ","バナナ","みかん"};
        if(array.length >= 4){
            System.out.println(array[3]);
        }
        
    }
}

3. 共通の対策:try-catchで例外を捕捉

どれだけ注意しても、予想外のデータや状況で例外が発生することはあります。
そのため、最後の保険として try-catch を使い、発生した例外を正確に捕捉しログに残すことが重要です。

try {
    // 業務ロジック処理
} catch (NullPointerException e) {
    log.error("NullPointerException発生: " + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
    log.error("配列範囲外アクセス: " + e.getMessage());
} catch (Exception e) {
    log.error("その他の例外: " + e.getMessage());
}

こうすることで、後から原因を調査しやすくなり、保守性も高まります。


お役に立てればうれしいです。

ABOUT ME
自己紹介
自己紹介
職業:Web開発エンジニア
こんにちは!
このブログでは、ITのお仕事で学んだ知識や、 日本での生活で学んだ知識を紹介しています。
お役に立てればうれしいです 😊
記事URLをコピーしました