Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのNullPointerException(NPE)の原因と解決方法を徹底解説

NullPointerExceptionは、アプリケーションコードや参照先のAPI、ミドルウェアが以下のような状況に遭遇した際に、JVM(Java仮想マシン)によってスローされる実行時例外です。

  • nullオブジェクトのインスタンスメソッドを呼び出そうとした場合
  • nullオブジェクトの特定のフィールドへアクセスまたは変更しようとした場合
  • nullオブジェクトを配列として扱い、長さ(length)を取得しようとした場合

NullPointerExceptionを解決するための手順

  1. java.lang.NullPointerExceptionのスタックトレースを確認し、例外がどこで発生したのか(アプリケーションコード、サードパーティAPI、ミドルウェアなど)を特定し、該当する行番号を抽出します。
  2. 問題がアプリケーションコード内にある場合は、コードのウォークスルー(詳細なレビュー)を実施します。サードパーティAPIやミドルウェアに起因する場合は、まず呼び出し側のコードを見直し、間接的に問題の原因になっていないかを確認しましょう。たとえば、null値をサードパーティAPIのメソッドに引数として渡していないかなどが挙げられます。
  3. 問題がアプリケーションコード内で見つかったら、どのオブジェクトインスタンスがnullになっているのかを特定します。そのうえで、適切なnullチェックのバリデーションとログ出力をコードに追加することで、null値の発生源も把握できるようになります。

コード例

public class NPEDemo {
    private String field1 = null;
    private String field2 = null;
    public String getField1() {
        return field1;
    }
    private void setField1(String field1) {
        this.field1 = field1;
    }
    public String getField2() {
        return field2;
    }
    private void setField2(String field2) {
        this.field2 = field2;
    }
    public static void main(String[] args) {
        try {
            NPEDemo npe = new NPEDemo();
            npe.setField1("field1 value");
            npe = null;
            npe.setField2("field2 Value");
        } catch (Throwable e) {
            System.out.println("Java Error is: " + e);
            e.printStackTrace();
        }
    }
}

実行結果

Java Error is: java.lang.NullPointerException
java.lang.NullPointerException
at NPEDemo.main(NPEDemo.java:24)

この例では、生成したオブジェクトnpeにnullを代入した後でセッターメソッドを呼び出しているため、NullPointerExceptionが発生しています。スタックトレースには、例外が発生したクラス名と行番号(NPEDemo.javaの24行目)が出力されており、これがトラブルシューティングの出発点となります。

NullPointerExceptionを未然に防ぐためのポイント

  • メソッドの冒頭で引数やフィールドのnullチェックを行い、早期にエラーを検出する
  • Java 7以降ならObjects.requireNonNull()を使って明示的にnullを検証する
  • Java 8以降ではOptional型を活用し、nullの存在を型レベルで表現する
  • 文字列比較ではリテラル側からequalsを呼ぶ(例:"value".equals(str))ことでnull安全にする
  1. エラー500「Java.lang.NullPointerException」の原因と解決方法を徹底解説

    エラー500:Java.lang.NullPointerExceptionは、開発者がコードを実行する際に遭遇することがあるエラーです。また、一般ユーザーもアプリやゲームの起動時、あるいは特定のWebサイトにアクセスした際にこのエラー500に直面することがあります。通常、以下のようなエラーメッセージが表示されます。コーディングの世界では使用される言語やツールが多岐にわたるため、すべてを本記事で網羅することはできませんが、開発者にとっての原因は主に次の2つです。1つはコード自体のミス(例:初期化前に関数を呼び出してしまう)、もう1つはサーバーサイドの問題(例:doGet()が必要な場面でdoPo

  2. JavaでJSONをパース(解析)する方法|org.json・Gson・JsonPathの使い方を解説

    このチュートリアルでは、JavaでJSONを解析(パース)する方法を、複数のライブラリの使い方とあわせて解説します。 JSONとは「JavaScript Object Notation」の略称で、JavaScriptのサブセットをベースとした軽量なデータ形式です。 データ交換フォーマットとして広く普及しており、Webプログラミングにおいて不可欠な技術となっています。本記事では、org.jsonライブラリを使ったJSONのパース方法を中心に紹介します。 まず基本をおさらいしましょう。JSONオブジェクトは「キーと値のペア」から構成される順序のない集合です。一方、JSON配列は値が順序付けて格納さ