Java で Integer オブジェクトが null かどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java で Integer ラッパーオブジェクトを安全に扱う方法、特に null かどうかをチェックする方法を学びます。プリミティブ型の int とは異なり、Integernull 参照を持つことができるオブジェクトであり、null チェックを行わないと、一般的な NullPointerException エラーが発生する可能性があります。

実際の例を通じて、基本的な == null チェックを探索し、null チェックと値の比較を組み合わせ、最後に、Java コードでより堅牢で表現力のある null 処理を行うために Optional クラスを活用する方法を学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/wrapper_classes("Wrapper Classes") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/operators -.-> lab-560008{{"Java で Integer オブジェクトが null かどうかをチェックする方法"}} java/variables -.-> lab-560008{{"Java で Integer オブジェクトが null かどうかをチェックする方法"}} java/if_else -.-> lab-560008{{"Java で Integer オブジェクトが null かどうかをチェックする方法"}} java/classes_objects -.-> lab-560008{{"Java で Integer オブジェクトが null かどうかをチェックする方法"}} java/exceptions -.-> lab-560008{{"Java で Integer オブジェクトが null かどうかをチェックする方法"}} java/wrapper_classes -.-> lab-560008{{"Java で Integer オブジェクトが null かどうかをチェックする方法"}} java/object_methods -.-> lab-560008{{"Java で Integer オブジェクトが null かどうかをチェックする方法"}} end

Integer ラッパーの null チェック

このステップでは、Java で Integer ラッパーオブジェクトを扱う方法、特に null かどうかをチェックする方法を探索します。int のようなプリミティブ型とは異なり、Integer はクラスです。つまり、Integer 変数はオブジェクトへの参照を保持することができ、何のオブジェクトも参照しない場合は null になります。Java では、非常に一般的でプログラムをクラッシュさせる可能性のある NullPointerException エラーを防ぐために、null 値を適切に扱うことが重要です。

Integernull チェックを実演するために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。前の実験を完了している場合、このファイルは ~/project ディレクトリに既に存在するはずです。

  2. HelloJava.java の既存のコードを以下のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            Integer myInteger = null; // Declaring an Integer and setting it to null
    
            // Check if myInteger is null
            if (myInteger == null) {
                System.out.println("myInteger is null.");
            } else {
                System.out.println("myInteger is not null. Its value is: " + myInteger);
            }
    
            // Let's try with a non-null Integer
            Integer anotherInteger = 10; // Declaring and initializing with a value
    
            // Check if anotherInteger is null
            if (anotherInteger == null) {
                System.out.println("anotherInteger is null.");
            } else {
                System.out.println("anotherInteger is not null. Its value is: " + anotherInteger);
            }
        }
    }

    このコードでは、以下のことを行っています。

    • Integer 変数 myInteger を宣言し、明示的に null に設定しています。
    • if 文を使用して、== 演算子で myIntegernull かどうかをチェックしています。これは Java でオブジェクト参照が null かどうかをチェックする標準的な方法です。
    • 別の Integer 変数 anotherInteger を宣言し、値 10 を割り当てています。Java は自動的にプリミティブ型の int10Integer オブジェクトに変換します(これをオートボクシングと呼びます)。
    • anotherInteger に対して同じ null チェックを行っています。
  3. HelloJava.java ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルで javac コマンドを使用してプログラムをコンパイルします。~/project ディレクトリにいることを確認してください。

    javac HelloJava.java

    エラーがなければ、コンパイルは無事に完了し、~/project ディレクトリに HelloJava.class ファイルが作成されます。

  5. java コマンドを使用してコンパイルされたプログラムを実行します。

    java HelloJava

    次のような出力が表示されるはずです。

    myInteger is null.
    anotherInteger is not null. Its value is: 10

    この出力は、nullIntegernull でない Integer の両方に対して null チェックが正しく機能したことを確認しています。null をチェックする方法を理解することは、Java プログラミングにおける基本的なスキルであり、特にラッパークラスや必ずしも値が割り当てられていないオブジェクトを扱う際に重要です。

null チェックと値チェックの組み合わせ

前のステップでは、Integer オブジェクトが null かどうかをチェックする方法を学びました。多くの場合、Integernull でないことと、その値が特定の条件を満たすことを同時にチェックする必要があります。これらのチェックを組み合わせることは重要です。なぜなら、nullInteger の値にアクセスしようとすると、NullPointerException が発生するからです。

null チェックと値チェックを組み合わせる方法を実演するために、プログラムを修正しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを以下のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            Integer score = null; // Example 1: score is null
    
            // Check if score is not null AND its value is greater than 50
            if (score != null && score > 50) {
                System.out.println("Score is not null and is greater than 50.");
            } else {
                System.out.println("Score is null or not greater than 50.");
            }
    
            Integer anotherScore = 75; // Example 2: score is 75
    
            // Check if anotherScore is not null AND its value is greater than 50
            if (anotherScore != null && anotherScore > 50) {
                System.out.println("anotherScore is not null and is greater than 50.");
            } else {
                System.out.println("anotherScore is null or not greater than 50.");
            }
    
            Integer yetAnotherScore = 40; // Example 3: score is 40
    
            // Check if yetAnotherScore is not null AND its value is greater than 50
            if (yetAnotherScore != null && yetAnotherScore > 50) {
                System.out.println("yetAnotherScore is not null and is greater than 50.");
            } else {
                System.out.println("yetAnotherScore is null or not greater than 50.");
            }
        }
    }

    この更新されたコードでは、以下のことを行っています。

    • 論理 AND 演算子 (&&) を使用して、score != nullscore > 50 の 2 つの条件を組み合わせています。
    • score != null のチェックが最初に行われます。Java では、&& 演算子は短絡評価を行います。つまり、最初の条件 (score != null) が偽の場合、2 番目の条件 (score > 50) は評価されません。これにより、scorenull の場合に NullPointerException が発生するのを防ぎます。なぜなら、score > 50 のコードは実行されないからです。
    • このロジックを 3 つの異なる Integer 変数でテストしています。1 つは null、1 つは null でなく 50 より大きい値、もう 1 つは null でないが 50 より大きくない値です。
  3. HelloJava.java ファイルを保存します。

  4. ターミナルで修正したプログラムをコンパイルします。

    javac HelloJava.java
  5. コンパイルされたプログラムを実行します。

    java HelloJava

    次のような出力が表示されるはずです。

    Score is null or not greater than 50.
    anotherScore is not null and is greater than 50.
    yetAnotherScore is null or not greater than 50.

    この出力は、組み合わせたチェックがどのように機能するかを示しています。最初のケースでは、scorenull であることが正しく識別されています。2 番目のケースでは、anotherScorenull でなく 50 より大きいことが識別されています。3 番目のケースでは、yetAnotherScorenull ではないが 50 より大きくないことが識別されています。オブジェクトのプロパティや値にアクセスする前に null をチェックするこのパターンは、Java における基本的な安全対策です。

Optional を使用した安全なハンドリング

== null を使って null をチェックし、&& でチェックを組み合わせる方法は有効ですが、Java 8 では値が存在しない(つまり null)場合をより適切に扱うために Optional クラスが導入されました。Optional は、null ではない値を含む場合も含まない場合もあるコンテナオブジェクトです。Optional を使用すると、コードがより読みやすくなり、NullPointerException エラーが発生しにくくなります。

このステップでは、プログラムをリファクタリングして、潜在的に存在しない整数値を Optional<Integer> を使って扱うようにします。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを以下のコードに置き換えます。

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Example 1: Optional containing a null value (empty Optional)
            Optional<Integer> optionalScoreNull = Optional.empty();
    
            // Check if the Optional contains a value and if it's greater than 50
            if (optionalScoreNull.isPresent() && optionalScoreNull.get() > 50) {
                 System.out.println("optionalScoreNull is present and greater than 50.");
            } else {
                 System.out.println("optionalScoreNull is empty or not greater than 50.");
            }
    
            // Example 2: Optional containing a non-null value (75)
            Optional<Integer> optionalScorePresent = Optional.of(75);
    
            // Check if the Optional contains a value and if it's greater than 50
            if (optionalScorePresent.isPresent() && optionalScorePresent.get() > 50) {
                 System.out.println("optionalScorePresent is present and greater than 50.");
            } else {
                 System.out.println("optionalScorePresent is empty or not greater than 50.");
            }
    
            // Example 3: Optional containing a non-null value (40)
            Optional<Integer> optionalScoreNotGreater = Optional.of(40);
    
            // Check if the Optional contains a value and if it's greater than 50
            if (optionalScoreNotGreater.isPresent() && optionalScoreNotGreater.get() > 50) {
                 System.out.println("optionalScoreNotGreater is present and greater than 50.");
            } else {
                 System.out.println("optionalScoreNotGreater is empty or not greater than 50.");
            }
    
            // A more functional way using Optional methods
            System.out.println("\nUsing Optional methods:");
    
            optionalScoreNull.ifPresent(value -> System.out.println("Value from optionalScoreNull: " + value));
            optionalScorePresent.ifPresent(value -> System.out.println("Value from optionalScorePresent: " + value));
            optionalScoreNotGreater.ifPresent(value -> System.out.println("Value from optionalScoreNotGreater: " + value));
    
            // Using orElse to provide a default value if Optional is empty
            Integer scoreOrDefault = optionalScoreNull.orElse(0);
            System.out.println("Value from optionalScoreNull with default: " + scoreOrDefault);
    
            // Using filter for conditional checks
            optionalScorePresent.filter(value -> value > 50)
                                .ifPresent(value -> System.out.println("Filtered optionalScorePresent value: " + value));
    
             optionalScoreNotGreater.filter(value -> value > 50)
                                .ifPresent(value -> System.out.println("Filtered optionalScoreNotGreater value: " + value));
        }
    }

    主な変更点を見てみましょう。

    • import java.util.Optional;Optional クラスをインポートします。
    • Optional<Integer> optionalScoreNull = Optional.empty();:値が存在しないことを表す空の Optional を作成します。
    • Optional<Integer> optionalScorePresent = Optional.of(75);Optional.of() を使って null ではない値を含む Optional を作成します。なお、Optional.of()null 値を渡すと NullPointerException がスローされます。値が null になる可能性がある場合は、Optional.ofNullable() を使用してください。
    • optionalScoreNull.isPresent():このメソッドは、Optional が値を含んでいるかどうかをチェックします。null をチェックする代わりに、存在をチェックする推奨される方法です。
    • optionalScoreNull.get():このメソッドは、Optional から値を取得します。注意! Optional が空の場合、get() を呼び出すと NoSuchElementException がスローされます。そのため、get() を呼び出す前に常に isPresent() をチェックするか、空の場合を適切に処理する他の Optional メソッドを使用する必要があります。
    • optionalScoreNull.ifPresent(value -> ...):このメソッドは、Optional が値を含んでいる場合にのみ、指定されたコードを実行します。値が存在する場合にその値に対してアクションを実行するクリーンな方法です。
    • optionalScoreNull.orElse(0):このメソッドは、値が存在する場合はその値を返し、そうでない場合は指定されたデフォルト値(この場合は 0)を返します。
    • optionalScorePresent.filter(value -> value > 50):このメソッドは、値が存在し、かつ指定された条件(値 > 50)に一致する場合に、その値を含む Optional を返します。そうでない場合は、空の Optional を返します。
  3. HelloJava.java ファイルを保存します。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
  5. コンパイルされたプログラムを実行します。

    java HelloJava

    次のような出力が表示されるはずです。

    optionalScoreNull is empty or not greater than 50.
    optionalScorePresent is present and greater than 50.
    optionalScoreNotGreater is empty or not greater than 50.
    
    Using Optional methods:
    Value from optionalScorePresent: 75
    Value from optionalScoreNotGreater: 40
    Value from optionalScoreNull with default: 0
    Filtered optionalScorePresent value: 75

    この出力は、Optional を使って値の存在または非存在を扱い、安全に操作を実行できることを示しています。if (isPresent() && get() > 50) のパターンは null チェックに似ていますが、Optional は他にも多くの便利なメソッド(ifPresentorElsefiltermap など)を提供しており、潜在的に存在しない値を扱う際に、より表現力があり安全なコードを書くことができます。Optional を使用することは、現代の Java 開発における良い習慣です。

まとめ

この実験では、Java で Integer ラッパーオブジェクトが null かどうかをチェックする方法を学びました。まず、Integer はクラスであり、プリミティブ型の int とは異なり、null 参照を保持できることを理解しました。単純な Java プログラムを使って基本的な == null チェックを実演し、NullPointerException を防ぐために null と非 nullInteger 変数の両方をどのように扱うかを示しました。