Java で Boolean が null かどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

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

はじめに

この実験では、Java で Boolean オブジェクトを扱う際に、null 値を安全に処理する方法を学びます。プリミティブ型の boolean と比較して、Boolean ラッパークラスを扱う際に NullPointerException が発生する潜在的な危険性を調べます。

Boolean オブジェクトの値にアクセスする前に、そのオブジェクトが null かどうかを正しくチェックする方法を学び、より堅牢な null 処理のために Optional クラスを利用し、プリミティブ型の booleanBoolean ラッパークラスの null 挙動の主要な違いを実際の例を通じて理解します。


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/data_types("Data Types") java/BasicSyntaxGroup -.-> java/booleans("Booleans") 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/data_types -.-> lab-559931{{"Java で Boolean が null かどうかをチェックする方法"}} java/booleans -.-> lab-559931{{"Java で Boolean が null かどうかをチェックする方法"}} java/if_else -.-> lab-559931{{"Java で Boolean が null かどうかをチェックする方法"}} java/classes_objects -.-> lab-559931{{"Java で Boolean が null かどうかをチェックする方法"}} java/exceptions -.-> lab-559931{{"Java で Boolean が null かどうかをチェックする方法"}} java/wrapper_classes -.-> lab-559931{{"Java で Boolean が null かどうかをチェックする方法"}} java/object_methods -.-> lab-559931{{"Java で Boolean が null かどうかをチェックする方法"}} end

Boolean オブジェクトの null チェック

このステップでは、Java で Boolean オブジェクトを扱う際に、潜在的な null 値をどのように処理するかを調べます。常に true または false のいずれかであるプリミティブ型の boolean とは異なり、Boolean ラッパークラスは null 値を保持することができます。これは、注意深く処理しないと NullPointerException エラーの一般的な原因となります。

これを実証するために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタを開きます。

  2. 左側のファイルエクスプローラで、~/project ディレクトリにいることを確認します。

  3. ファイルエクスプローラの空白部分を右クリックし、「New File」を選択して、BooleanCheck.java と名前を付けます。

  4. エディタで BooleanCheck.java ファイルを開きます。

  5. 次のコードをエディタにコピーして貼り付けます。

    public class BooleanCheck {
        public static void main(String[] args) {
            Boolean myBoolean = null;
    
            // This will cause a NullPointerException if myBoolean is null
            // if (myBoolean) {
            //     System.out.println("myBoolean is true");
            // }
    
            // Correct way to check for null before accessing the boolean value
            if (myBoolean != null && myBoolean) {
                System.out.println("myBoolean is true");
            } else if (myBoolean == null) {
                System.out.println("myBoolean is null");
            } else {
                System.out.println("myBoolean is false");
            }
        }
    }

    このコードでは:

    • Boolean オブジェクト myBoolean を宣言し、null で初期化します。
    • コメントアウトされた if (myBoolean) の行は、myBooleannull の場合に NullPointerException を引き起こす一般的な間違いを示しています。
    • if (myBoolean != null && myBoolean) の行は、Boolean オブジェクトのブール値を評価しようとする 前に、そのオブジェクトが null でないことをチェックする正しい方法を示しています。&& 演算子は短絡演算子であり、myBoolean != null が false の場合、2 番目の部分 (myBoolean) は評価されず、エラーが防止されます。
  6. ファイルを保存します (Ctrl+S または Cmd+S)。

  7. WebIDE の下部にあるターミナルを開きます。cd ~/project コマンドを使用して、~/project ディレクトリにいることを確認します。

  8. 次のコマンドを入力して Enter キーを押し、Java プログラムをコンパイルします。

    javac BooleanCheck.java

    エラーがなければ、何も出力されません。~/project ディレクトリに BooleanCheck.class ファイルが作成されます。

  9. 次のコマンドを入力して Enter キーを押し、コンパイルされたプログラムを実行します。

    java BooleanCheck

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

    myBoolean is null

この出力は、プログラムが myBooleannull であることを正しく識別し、NullPointerException を回避したことを確認しています。Boolean オブジェクトで null を処理する方法を理解することは、堅牢な Java コードを書くために重要です。

Optional を使用した null 処理

このステップでは、Java 8 で導入された Optional クラスを使用して、Java で潜在的な null 値を処理するより現代的なアプローチを探ります。Optional は、null でない値を含む場合と含まない場合があるコンテナオブジェクトです。値が存在しない可能性があることを明示的に示す明確な方法を提供し、NullPointerException エラーを防ぎ、コードをより読みやすくします。

前の例を Optional<Boolean> を使用するように変更しましょう。

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

  2. ファイルの内容全体を次の新しいコードに置き換えます。

    import java.util.Optional;
    
    public class BooleanCheck {
        public static void main(String[] args) {
            // Creating an Optional that contains a Boolean value
            Optional<Boolean> optionalBooleanPresent = Optional.of(true);
    
            // Creating an Optional that is empty (represents null)
            Optional<Boolean> optionalBooleanEmpty = Optional.empty();
    
            // Handling the present Optional
            if (optionalBooleanPresent.isPresent()) {
                System.out.println("optionalBooleanPresent has a value: " + optionalBooleanPresent.get());
            } else {
                System.out.println("optionalBooleanPresent is empty");
            }
    
            // Handling the empty Optional
            if (optionalBooleanEmpty.isPresent()) {
                System.out.println("optionalBooleanEmpty has a value: " + optionalBooleanEmpty.get());
            } else {
                System.out.println("optionalBooleanEmpty is empty");
            }
    
            // Using orElse to provide a default value if the Optional is empty
            Boolean valueOrDefault = optionalBooleanEmpty.orElse(false);
            System.out.println("Value from optionalBooleanEmpty orElse(false): " + valueOrDefault);
    
            // Using ifPresent to perform an action only if a value is present
            optionalBooleanPresent.ifPresent(value -> System.out.println("Value is present: " + value));
        }
    }

    この更新されたコードでは:

    • java.util.Optional クラスをインポートします。
    • 2 つの Optional<Boolean> オブジェクトを作成します。1 つは値を持つ (Optional.of(true)) もので、もう 1 つは空の (Optional.empty()) ものです。
    • isPresent() を使用して、Optional が値を含んでいるかどうかをチェックします。
    • get() を使用して、Optional から値を取得します。注意: 空の Optionalget() を呼び出すと NoSuchElementException がスローされるため、必ず isPresent() で最初にチェックするか、他の Optional メソッドを使用してください。
    • orElse(false) をデモンストレーションします。これは、値が存在する場合はその値を返し、存在しない場合は指定されたデフォルト値 (この場合は false) を返します。
    • ifPresent() を示します。これはラムダ式を受け取り、Optional に値が存在する場合にのみそれを実行します。
  3. ファイルを保存します (Ctrl+S または Cmd+S)。

  4. WebIDE の下部にあるターミナルを開きます。cd ~/project コマンドを使用して、~/project ディレクトリにいることを確認します。

  5. 次のコマンドを入力して Enter キーを押し、Java プログラムをコンパイルします。

    javac BooleanCheck.java

    コンパイルが成功すると、新しい BooleanCheck.class ファイルが生成されます。

  6. 次のコマンドを入力して Enter キーを押し、コンパイルされたプログラムを実行します。

    java BooleanCheck

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

    optionalBooleanPresent has a value: true
    optionalBooleanEmpty is empty
    Value from optionalBooleanEmpty orElse(false): false
    Value is present: true

この出力は、Optionalnull を単に使用するよりも、値の存在または不存在をより明示的かつ安全に処理するためにどのように使用できるかを示しています。Optional を使用すると、コードが明確になり、NullPointerException の可能性が減少します。

プリミティブ型とラッパークラスのテスト

このステップでは、Java のプリミティブ型 booleanBoolean ラッパークラスの主な違い、特に null となり得るかどうかについて説明します。この違いを理解することは、ブール値を扱う際に NullPointerException を回避するための基本となります。

  • プリミティブ型 boolean:これは Java の基本データ型です。true または false の 2 つの値のいずれかしか保持できません。プリミティブ型の boolean 変数は 決して null にはなりません。
  • Boolean ラッパークラス:これはプリミティブ型の boolean 値をラップするオブジェクトです。オブジェクトであるため、Boolean 変数は Boolean オブジェクトへの参照(true または false を含む)を保持することも、null 値を保持することもできます。

この違いを実証するために、簡単なプログラムを作成しましょう。

  1. WebIDE エディタを開きます。

  2. 左側のファイルエクスプローラで、~/project ディレクトリにいることを確認します。

  3. ファイルエクスプローラの空白部分を右クリックし、「New File」を選択して、PrimitiveVsWrapper.java と名前を付けます。

  4. エディタで PrimitiveVsWrapper.java ファイルを開きます。

  5. 次のコードをエディタにコピーして貼り付けます。

    public class PrimitiveVsWrapper {
        public static void main(String[] args) {
            // Declaring a primitive boolean
            boolean primitiveBoolean = true;
    
            // Declaring a Boolean wrapper object
            Boolean wrapperBoolean = null; // Wrapper can be null
    
            System.out.println("Primitive boolean value: " + primitiveBoolean);
    
            // Checking if the wrapper Boolean is null before printing
            if (wrapperBoolean == null) {
                System.out.println("Wrapper Boolean is null");
            } else {
                System.out.println("Wrapper Boolean value: " + wrapperBoolean);
            }
    
            // Attempting to assign null to a primitive boolean will cause a compile-time error
            // primitiveBoolean = null; // Uncommenting this line will cause an error
        }
    }

    このコードでは:

    • プリミティブ型の boolean を宣言し、true で初期化します。
    • Boolean ラッパーオブジェクトを宣言し、null で初期化します。これはラッパークラスでは有効です。
    • プリミティブ型の boolean の値を出力します。
    • ラッパークラスの Boolean の値を出力する前に、それが null かどうかをチェックします。これは、ラッパー型では null チェックが必要であることを示しています。
    • コメントアウトされた行は、プリミティブ型の booleannull を代入することはできないことを示しています。この行のコメントを外してコンパイルしようとすると、コンパイルエラーが発生します。
  6. ファイルを保存します (Ctrl+S または Cmd+S)。

  7. WebIDE の下部にあるターミナルを開きます。cd ~/project コマンドを使用して、~/project ディレクトリにいることを確認します。

  8. 次のコマンドを入力して Enter キーを押し、Java プログラムをコンパイルします。

    javac PrimitiveVsWrapper.java

    エラーがなければ、PrimitiveVsWrapper.class ファイルが作成されます。

  9. 次のコマンドを入力して Enter キーを押し、コンパイルされたプログラムを実行します。

    java PrimitiveVsWrapper

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

    Primitive boolean value: true
    Wrapper Boolean is null

この出力は、プリミティブ型の boolean が値(true)を保持しているのに対し、Boolean ラッパーオブジェクトは null を保持できることを明確に示しています。この違いは、Java プログラムを設計し、潜在的な欠落値を処理する際に重要です。

まとめ

この実験では、Java で Boolean オブジェクトを扱う際に潜在的な null 値をどのように処理するかを学びました。プリミティブ型の boolean とは異なり、Boolean ラッパークラスは null になる可能性があり、これが NullPointerException エラーの原因になることがあることがわかりました。!= null チェックと論理 AND 演算子 (&&) を組み合わせて、Boolean オブジェクトが null でないことをアクセスする前に確認する正しい方法を実証しました。これにより、オブジェクトが null でない場合にのみブール値が評価され、実行時エラーを防ぐことができます。