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

JavaJavaBeginner
今すぐ練習

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

はじめに

この実験では、Java で Boolean ラッパーオブジェクトが null かどうかを安全にチェックする方法を学びます。プリミティブな boolean 型とは異なり、Boolean クラスは null 値を保持することができます。これを正しく処理しないと、NullPointerException が発生する可能性があります。

nullBoolean オブジェクトを処理するさまざまな手法を探ります。これには、直接的な null チェック、null と真偽値のチェックを組み合わせる方法、そしてより堅牢な null 処理のために Optional クラスを利用する方法が含まれます。この実験の終わりまでに、Java で Boolean ラッパーオブジェクトを扱う際の一般的な落とし穴を回避できるようになります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/booleans("Booleans") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/booleans -.-> lab-559932{{"Java で Boolean オブジェクトが null かどうかをチェックする方法"}} java/variables -.-> lab-559932{{"Java で Boolean オブジェクトが null かどうかをチェックする方法"}} java/if_else -.-> lab-559932{{"Java で Boolean オブジェクトが null かどうかをチェックする方法"}} java/object_methods -.-> lab-559932{{"Java で Boolean オブジェクトが null かどうかをチェックする方法"}} end

Boolean ラッパーの null チェック

このステップでは、Java で Boolean ラッパーオブジェクトを扱う方法を探ります。具体的には、Boolean オブジェクトが null かどうかをチェックすることに焦点を当てます。true または false のみを取り得るプリミティブな boolean 型とは異なり、Boolean ラッパークラスは null 値も保持できます。これを注意深く処理しないと、NullPointerException の一般的な原因となります。

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

  1. WebIDE の左側にあるファイルエクスプローラーで ~/project ディレクトリを開きます。

  2. ~/project ディレクトリ内の空白部分を右クリックし、「新しいファイル」を選択します。

  3. 新しいファイルの名前を BooleanCheck.java として、Enter キーを押します。

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

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

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean myBoolean = null;
    
            // Attempting to directly use a null Boolean in a conditional
            // will cause a NullPointerException
            // if (myBoolean) {
            //     System.out.println("This will not be printed if myBoolean is null.");
            // }
    
            // Correct way to check if a Boolean wrapper is null
            if (myBoolean == null) {
                System.out.println("myBoolean is null.");
            } else {
                System.out.println("myBoolean is not null.");
            }
    
            // Another way to check the boolean value safely
            if (Boolean.TRUE.equals(myBoolean)) {
                 System.out.println("myBoolean is true.");
            } else if (Boolean.FALSE.equals(myBoolean)) {
                 System.out.println("myBoolean is false.");
            } else {
                 System.out.println("myBoolean is null (checked using equals).");
            }
        }
    }
  6. Ctrl + S(Mac の場合は Cmd + S)を押してファイルを保存します。

  7. 次に、Java プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開きます。~/project ディレクトリにいることを確認します。もしそうでない場合は、cd ~/project と入力して Enter キーを押します。

  8. javac コマンドを使用してコードをコンパイルします。

    javac BooleanCheck.java

    エラーがなければ、コマンドは何も出力せずに完了します。これは、~/project ディレクトリに BooleanCheck.class ファイルが作成されたことを意味します。

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

    java BooleanCheck
  10. ターミナルに次の出力が表示されるはずです。

    myBoolean is null.
    myBoolean is null (checked using equals).

この出力は、== null チェックと Boolean.TRUE.equals() / Boolean.FALSE.equals() パターンを使用して、コードが Boolean オブジェクトを正しく null と識別したことを確認しています。コメントアウトされたコードは、nullBooleanif 条件で直接使用しようとした場合に何が起こるかを示しています。これは NullPointerException を引き起こします。

nullBoolean オブジェクトを安全に扱う方法を理解することは、Java プログラミングにおける一般的なエラーを回避するために重要です。

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

前のステップでは、Boolean オブジェクトが null かどうかをチェックする方法を見ました。多くの場合、Booleantruefalse、または null のいずれかであるかをチェックする必要があります。これらのチェックを効率的かつ安全に組み合わせることは重要です。

Boolean の 3 つの可能性(nulltruefalse)をすべて扱う方法を実証するために、BooleanCheck.java プログラムを修正しましょう。

  1. BooleanCheck.java ファイルがまだ開いていない場合は、コードエディターで開きます。このファイルは ~/project ディレクトリにあるはずです。

  2. BooleanCheck.java の既存のコードを次のコードに置き換えます。このバージョンには、nulltrue、および falseBoolean 値の例が含まれています。

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean booleanValue1 = null;
            Boolean booleanValue2 = true;
            Boolean booleanValue3 = false;
    
            System.out.println("Checking booleanValue1 (null):");
            checkBoolean(booleanValue1);
    
            System.out.println("\nChecking booleanValue2 (true):");
            checkBoolean(booleanValue2);
    
            System.out.println("\nChecking booleanValue3 (false):");
            checkBoolean(booleanValue3);
        }
    
        // A helper method to demonstrate the checks
        public static void checkBoolean(Boolean value) {
            if (value == null) {
                System.out.println("Value is null.");
            } else if (value) { // This is safe because we already checked for null
                System.out.println("Value is true.");
            } else { // If not null and not true, it must be false
                System.out.println("Value is false.");
            }
    
            // Another common pattern using equals for safety
            System.out.print("Using equals: ");
            if (Boolean.TRUE.equals(value)) {
                 System.out.println("Value is true.");
            } else if (Boolean.FALSE.equals(value)) {
                 System.out.println("Value is false.");
            } else {
                 System.out.println("Value is null.");
            }
        }
    }

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

    • Boolean オブジェクトを入力として受け取るヘルパーメソッド checkBoolean を定義しています。
    • checkBoolean の中で、まず value == null を使って valuenull かどうかをチェックします。
    • null でない場合、value を使ってブール値が true かどうかを安全にチェックします。これは、Java が Boolean ラッパーが null でない場合にのみ、Boolean ラッパーをプリミティブな boolean に自動的にアンボックスするため機能します。
    • null でも true でもない場合、それは false であるはずで、これは else ブロックで処理されます。
    • Boolean.TRUE.equals(value)Boolean.FALSE.equals(value) のパターンも再度含まれています。これは、equals が呼び出されるオブジェクトが null の場合に潜在的な NullPointerException を回避したいときに特に便利な、値をチェックする別の安全な方法です。
  3. ファイルを保存します(Ctrl + S または Cmd + S)。

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

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

    java BooleanCheck
  6. 次の出力が表示され、コードが各ケースをどのように処理するかが示されます。

    Checking booleanValue1 (null):
    Value is null.
    Using equals: Value is null.
    
    Checking booleanValue2 (true):
    Value is true.
    Using equals: Value is true.
    
    Checking booleanValue3 (false):
    Value is false.
    Using equals: Value is false.

このステップでは、Boolean ラッパーオブジェクトの状態を、nulltrue、および false の値を考慮してチェックする堅牢な方法を示しています。これは、安全で信頼性の高い Java コードを書くための基本的なスキルです。

Optional クラスを使用した処理

最新の Java(Java 8 以降)では、Optional クラスがしばしば、値が存在するかもしれないし、存在しないかもしれないことを表すために使用されます。これにより、値が欠けている可能性があることを明示的にすることで、コード内の NullPointerException の数を減らすことができます。Optional<Boolean> は必ずしも最も一般的な使用例ではありませんが、OptionalBoolean のようなラッパー型に適用する方法を理解するのに良い例です。

このステップでは、ブール値が欠けている可能性を扱うために、プログラムを Optional<Boolean> を使用するように修正します。

  1. コードエディターで BooleanCheck.java ファイルを開きます。このファイルは ~/project ディレクトリにあるはずです。

  2. 既存のコードを、Optional<Boolean> を使用する次のコードに置き換えます。

    import java.util.Optional;
    
    public class BooleanCheck {
    
        public static void main(String[] args) {
            Optional<Boolean> optionalBoolean1 = Optional.empty(); // Represents no value
            Optional<Boolean> optionalBoolean2 = Optional.of(true); // Represents the value true
            Optional<Boolean> optionalBoolean3 = Optional.of(false); // Represents the value false
    
            System.out.println("Checking optionalBoolean1 (empty):");
            checkOptionalBoolean(optionalBoolean1);
    
            System.out.println("\nChecking optionalBoolean2 (true):");
            checkOptionalBoolean(optionalBoolean2);
    
            System.out.println("\nChecking optionalBoolean3 (false):");
            checkOptionalBoolean(optionalBoolean3);
        }
    
        // A helper method to demonstrate checking Optional<Boolean>
        public static void checkOptionalBoolean(Optional<Boolean> optionalValue) {
            if (optionalValue.isPresent()) {
                // Get the boolean value if present
                Boolean value = optionalValue.get();
                if (value) {
                    System.out.println("Value is present and true.");
                } else {
                    System.out.println("Value is present and false.");
                }
            } else {
                System.out.println("Value is not present (empty Optional).");
            }
    
            // Another way using orElse
            System.out.print("Using orElse(false): ");
            boolean result = optionalValue.orElse(false);
            System.out.println("Result: " + result);
    
            // Using ifPresent
            System.out.print("Using ifPresent: ");
            optionalValue.ifPresent(val -> System.out.println("Value is present: " + val));
            if (!optionalValue.isPresent()) {
                 System.out.println("Value is not present.");
            }
        }
    }

    このバージョンでは、以下のことを行っています。

    • java.util.Optional クラスをインポートしています。
    • 欠けている値には Optional.empty() を、存在する値には Optional.of() を使用して、Optional<Boolean> オブジェクトを作成しています。
    • checkOptionalBoolean メソッドは、Optional<Boolean> を引数として受け取るようになっています。
    • optionalValue.isPresent() を使用して、値が存在するかどうかをチェックしています。
    • 値が存在する場合、optionalValue.get() を使用してその値を取得します。注意: isPresent() をチェックした後でのみ get() を呼び出してください。そうしないと、NoSuchElementException が発生します。
    • orElse(false) も使用しています。これは、Optional が空の場合にデフォルト値(この場合は false)を提供します。
    • ifPresent() を使用すると、値が存在する場合にのみアクションを実行することができます。
  3. ファイルを保存します(Ctrl + S または Cmd + S)。

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

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

    java BooleanCheck
  6. 次の出力が表示されるはずです。

    Checking optionalBoolean1 (empty):
    Value is not present (empty Optional).
    Using orElse(false): Result: false
    Using ifPresent: Value is not present.
    
    Checking optionalBoolean2 (true):
    Value is present and true.
    Using orElse(false): Result: true
    Using ifPresent: Value is present: true
    
    Checking optionalBoolean3 (false):
    Value is present and false.
    Using orElse(false): Result: false
    Using ifPresent: Value is present: false

この出力は、Optional<Boolean> を使用してブール値の存在または非存在を明示的に扱う方法を示しています。これは、単にヌル可能な Boolean を使用する場合と比較して、潜在的に欠けているデータを扱うより堅牢な方法を提供します。

まとめ

この実験では、Java で Boolean ラッパーオブジェクトが null かどうかをチェックする方法を学びました。プリミティブな boolean 型と Boolean ラッパークラスの違いを調べ、nullBoolean オブジェクトを扱う際に NullPointerException が発生する可能性について強調しました。等価演算子 (== null) を使用して null を正しくチェックする方法を実証し、Boolean.TRUEBoolean.FALSEequals() メソッドを使用してブール値を安全にチェックする方法も示しました。これらの技術は、ヌル可能な Boolean オブジェクトを扱う際にランタイムエラーを防ぐために重要です。