Java でブール変数が true かどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

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

はじめに

この実験では、Java でブール変数が true かどうかを確認する方法を学びます。等価演算子を使用した基本的な方法を探り、Boolean ラッパークラスの扱いを深く掘り下げ、潜在的な null 値の管理方法についても議論します。

実践的な例を通じて、ブール値に基づく条件ロジックを記述する実践的な経験を積み、Java コードが堅牢でさまざまなシナリオを効果的に処理できるようにします。


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/booleans("Booleans") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/wrapper_classes("Wrapper Classes") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/booleans -.-> lab-559934{{"Java でブール変数が true かどうかをチェックする方法"}} java/if_else -.-> lab-559934{{"Java でブール変数が true かどうかをチェックする方法"}} java/exceptions -.-> lab-559934{{"Java でブール変数が true かどうかをチェックする方法"}} java/wrapper_classes -.-> lab-559934{{"Java でブール変数が true かどうかをチェックする方法"}} java/object_methods -.-> lab-559934{{"Java でブール変数が true かどうかをチェックする方法"}} end

等価演算子を使用して true をチェックする

このステップでは、Java で等価演算子を使用してブール変数が true かどうかを確認する方法を探ります。一見簡単に見えるかもしれませんが、細かい点を理解することは、クリーンで正しいコードを書くために重要です。

Java では、boolean データ型は true または false の 2 つの値のいずれかを保持できます。ブール変数を持っている場合、プログラム内で決定を下すためにその値を確認する必要があることがよくあります。

ブール変数が true かどうかを確認する最も一般的な方法は、等価演算子 == を使用することです。

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

  1. WebIDE エディタで HelloJava.java ファイルが開いていない場合は、開きます。

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

    public class HelloJava {
        public static void main(String[] args) {
            boolean isJavaFun = true;
    
            if (isJavaFun == true) {
                System.out.println("Java is fun!");
            } else {
                System.out.println("Java is not fun.");
            }
        }
    }

    このコードの新しい部分を見てみましょう。

    • boolean isJavaFun = true;: この行は、isJavaFun という名前のブール変数を宣言し、true の値で初期化します。
    • if (isJavaFun == true): これは if 文です。括弧内の条件が true かどうかをチェックします。条件 isJavaFun == true は、等価演算子 == を使用して isJavaFun 変数の値をブールリテラル true と比較します。
    • System.out.println("Java is fun!");: この行は、条件 isJavaFun == truetrue の場合に実行されます。
    • else: このキーワードは、if 条件が false の場合に実行されるコードブロックを導入します。
    • System.out.println("Java is not fun.");: この行は、条件 isJavaFun == truefalse の場合に実行されます。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルで javac コマンドを使用してプログラムをコンパイルします。

    javac HelloJava.java

    エラーがなければ、~/project ディレクトリに HelloJava.class ファイルが作成されます。

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

    java HelloJava

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

    Java is fun!

    これは、if 条件 isJavaFun == truetrue と評価され、対応するメッセージが出力されたことを確認します。

== true を使用することは完全に有効で理解しやすいですが、Java では true のチェックを簡略化することができます。if 文はすでに括弧内の式をブール値として評価するため、ブール変数自体を条件として直接使用することができます。

この簡略化されたアプローチを使用するようにコードを変更しましょう。

  1. エディタで再度 HelloJava.java を開きます。

  2. if 文を次のように変更します。

    if (isJavaFun) {
        System.out.println("Java is fun!");
    } else {
        System.out.println("Java is not fun.");
    }

    == true を削除したことに注意してください。if (isJavaFun) 文は if (isJavaFun == true) と等価です。

  3. ファイルを保存します。

  4. 変更されたプログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを再度実行します。

    java HelloJava

    同じ出力が得られます。

    Java is fun!

    これは、if 条件でブール変数を直接使用することが、それが true かどうかをチェックするより簡潔で慣用的な方法であることを示しています。

要するに、等価演算子 == true を使用してブール値が true かどうかを確認することができますが、より一般的でクリーンな方法は、単にブール変数自体を if 文の条件として使用することです。

ブールラッパークラスでテストする

前のステップでは、プリミティブ型の boolean を扱いました。Java には、Boolean という対応するラッパークラスもあります。ラッパークラスは、プリミティブデータ型をオブジェクトとして使用する方法を提供します。これは、コレクションを扱う場合や、null である可能性のあるブール値を表す必要がある場合に特に便利です。

Boolean クラスには、ブール値用の 2 つの事前定義されたオブジェクト Boolean.TRUEBoolean.FALSE があります。これらは、それぞれブール値 truefalse を表す定数オブジェクトです。

Boolean オブジェクトを扱う場合でも、等価演算子 == を使用して比較することができます。ただし、== がオブジェクトでどのように動作するかを理解することが重要です。オブジェクトに対して == は、2 つの変数がメモリ内の まったく同じオブジェクト を参照しているかどうかをチェックし、単に同じ値を持っているかどうかではありません。

プログラムを変更して Boolean ラッパークラスを使用し、等価演算子がどのように動作するかを見てみましょう。

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

  2. コードを次のように置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            Boolean isJavaFunObject = Boolean.TRUE;
    
            if (isJavaFunObject == Boolean.TRUE) {
                System.out.println("Java is fun (using Boolean.TRUE)!");
            } else {
                System.out.println("Java is not fun (using Boolean.TRUE).");
            }
    
            Boolean anotherBooleanObject = true; // Autoboxing
    
            if (anotherBooleanObject == Boolean.TRUE) {
                 System.out.println("Another boolean object is true!");
            } else {
                 System.out.println("Another boolean object is not true.");
            }
        }
    }

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

    • Boolean isJavaFunObject = Boolean.TRUE;: Boolean 型の変数を宣言し、定数 Boolean.TRUE を割り当てます。
    • if (isJavaFunObject == Boolean.TRUE): 等価演算子 == を使用して、Boolean オブジェクトを Boolean.TRUE 定数と比較します。isJavaFunObject には Boolean.TRUE が割り当てられているため、同じオブジェクトを参照しているので、この条件は true になります。
    • Boolean anotherBooleanObject = true;: この行は「オートボクシング」を示しています。Java は自動的にプリミティブ型の booleantrueBoolean オブジェクトに変換します。
    • if (anotherBooleanObject == Boolean.TRUE): 再び == を使用して anotherBooleanObjectBoolean.TRUE と比較します。オートボクシングの仕組みと Java の Boolean 値のキャッシュにより、truefalse の値については、オートボクシングされた Boolean オブジェクトはしばしば Boolean.TRUEBoolean.FALSE と同じキャッシュされたインスタンスを参照します。したがって、この条件もおそらく true になります。
  3. ファイルを保存します。

  4. プログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを実行します。

    java HelloJava

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

    Java is fun (using Boolean.TRUE)!
    Another boolean object is true!

    これは、==Boolean.TRUE との比較に使用すると、これらのケースでは期待通りに動作することを確認します。なぜなら、変数はおそらく同じ基礎となる Boolean.TRUE オブジェクトを参照しているからです。

ただし、Boolean オブジェクトの比較に == を依存することは、より複雑なシナリオでは危険な場合があります。特に、Boolean オブジェクトが異なる方法で作成された場合や、異なるソースから来た場合です。Boolean オブジェクトの値の等価性を比較するより安全で推奨される方法は、.equals() メソッドを使用することです。

コードを変更して .equals() を使用しましょう。

  1. エディタで HelloJava.java を開きます。

  2. if 文を .equals() を使用するように変更します。

    public class HelloJava {
        public static void main(String[] args) {
            Boolean isJavaFunObject = Boolean.TRUE;
    
            if (isJavaFunObject.equals(Boolean.TRUE)) {
                System.out.println("Java is fun (using equals)!");
            } else {
                System.out.println("Java is not fun (using equals).");
            }
    
            Boolean anotherBooleanObject = true; // Autoboxing
    
            if (anotherBooleanObject.equals(Boolean.TRUE)) {
                 System.out.println("Another boolean object is true (using equals)!");
            } else {
                 System.out.println("Another boolean object is not true (using equals).");
            }
        }
    }

    == Boolean.TRUE.equals(Boolean.TRUE) に置き換えました。.equals() メソッドは、オブジェクトの を比較し、メモリ位置ではありません。

  3. ファイルを保存します。

  4. プログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを実行します。

    java HelloJava

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

    Java is fun (using equals)!
    Another boolean object is true (using equals)!

    .equals() を使用することは、Boolean オブジェクトの値の等価性を比較する標準的で最も安全な方法です。

要するに、キャッシュのために ==Boolean オブジェクトと Boolean.TRUE の比較に機能する場合がありますが、.equals() メソッドは、Boolean オブジェクトが true の値を表しているかどうかをチェックするための推奨される、より信頼性の高い方法です。

ヌルのブール値を扱う

前のステップでは、Boolean ラッパークラスについて学びました。プリミティブ型の booleanBoolean ラッパークラスの主な違いの 1 つは、Boolean 変数は null 値を保持できるのに対し、プリミティブ型の boolean は保持できないことです。Java では、NullPointerException エラーを防ぐために、null 値を適切に扱うことが重要です。

NullPointerException は、現在 null を指している変数を有効なオブジェクトのように使用しようとしたときに発生します。たとえば、null オブジェクトに対してメソッドを呼び出すと、NullPointerException が発生します。

Boolean オブジェクトが true かどうかをチェックするときは、オブジェクトが null である可能性がある場合は注意が必要です。

これまで学んだ方法を使って nullBoolean をチェックしようとするとどうなるか見てみましょう。

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

  2. コードを次のように置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            Boolean nullableBoolean = null;
    
            // Attempting to use == with null
            if (nullableBoolean == true) {
                System.out.println("This won't be printed.");
            } else {
                System.out.println("Using == with null Boolean.");
            }
    
            // Attempting to use .equals() with null
            // This will cause a NullPointerException!
            // if (nullableBoolean.equals(Boolean.TRUE)) {
            //     System.out.println("This will not be reached.");
            // } else {
            //     System.out.println("This will not be reached either.");
            // }
        }
    }

    このコードでは:

    • Boolean nullableBoolean = null;: Boolean 変数を宣言し、明示的に null に設定します。
    • if (nullableBoolean == true): 等価演算子 == を使用して、nullBoolean をプリミティブ型の true と比較します。Boolean オブジェクト(null であっても)をプリミティブ型の boolean と比較するとき、Java は「アンボクシング」を行います。つまり、Boolean オブジェクトをプリミティブ型の boolean に変換しようとします。Boolean オブジェクトが null の場合、このアンボクシング処理は NullPointerException を引き起こします。
    • コメントアウトされた .equals() のチェックも NullPointerException を引き起こします。なぜなら、null オブジェクト(nullableBoolean)に対して .equals() メソッドを呼び出そうとしているからです。
  3. ファイルを保存します。

  4. プログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを実行します。

    java HelloJava

    ターミナルにエラーメッセージが表示され、NullPointerException が示されます。

    Exception in thread "main" java.lang.NullPointerException
        at HelloJava.main(HelloJava.java:6)

    これは、潜在的に null である Boolean== を使ってプリミティブ型の boolean と直接比較したり、それに対して .equals() を呼び出したりすると、NullPointerException を引き起こす可能性があることを示しています。

潜在的に null である Boolean オブジェクトを安全に扱うには、アンボクシングしたりメソッドを呼び出したりする 前に、オブジェクトが null であるかどうかを常にチェックする必要があります。

Boolean オブジェクトが true かどうかを安全にチェックする方法は次の通りです。

  1. エディタで HelloJava.java を開きます。

  2. コードを次のように置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            Boolean nullableBoolean = null;
            Boolean trueBoolean = Boolean.TRUE;
            Boolean falseBoolean = Boolean.FALSE;
    
            // Safely check if nullableBoolean is true
            if (nullableBoolean != null && nullableBoolean == true) {
                System.out.println("nullableBoolean is true (safe check).");
            } else {
                System.out.println("nullableBoolean is not true or is null (safe check).");
            }
    
            // Safely check if trueBoolean is true
            if (trueBoolean != null && trueBoolean == true) {
                System.out.println("trueBoolean is true (safe check).");
            } else {
                System.out.println("trueBoolean is not true or is null (safe check).");
            }
    
            // Safely check if falseBoolean is true
            if (falseBoolean != null && falseBoolean == true) {
                System.out.println("falseBoolean is true (safe check).");
            } else {
                System.out.println("falseBoolean is not true or is null (safe check).");
            }
    
            // Alternative safe check using equals
            if (Boolean.TRUE.equals(nullableBoolean)) {
                 System.out.println("nullableBoolean is true (safe equals check).");
            } else {
                 System.out.println("nullableBoolean is not true or is null (safe equals check).");
            }
    
             if (Boolean.TRUE.equals(trueBoolean)) {
                 System.out.println("trueBoolean is true (safe equals check).");
             } else {
                 System.out.println("trueBoolean is not true or is null (safe equals check).");
             }
        }
    }

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

    • if (nullableBoolean != null && nullableBoolean == true): まず nullableBoolean != null を使って nullableBooleannull でないことをチェックします。&& 演算子は、条件の第 2 部(nullableBoolean == true)は、第 1 部(nullableBoolean != null)が true の場合にのみ評価されることを意味します。これにより NullPointerException が防止されます。nullableBooleannull の場合、第 1 部は false となり、第 2 部を評価することなく全体の条件は false となります。
    • if (Boolean.TRUE.equals(nullableBoolean)): これは、Boolean オブジェクトが null であっても、それが true かどうかを安全にチェックする別の方法です。既知の非 null オブジェクト Boolean.TRUE.equals() を呼び出し、潜在的に null であるオブジェクト nullableBoolean を引数として渡すことで、NullPointerException を回避します。.equals() メソッドは null 引数を適切に扱うように設計されており、Boolean.TRUE.equals(null) は単に false を返します。
  3. ファイルを保存します。

  4. プログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを実行します。

    java HelloJava

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

    nullableBoolean is not true or is null (safe check).
    trueBoolean is true (safe check).
    falseBoolean is not true or is null (safe check).
    nullableBoolean is not true or is null (safe equals check).
    trueBoolean is true (safe equals check).

    これは、!= null のチェックと == true を組み合わせる方法と、Boolean.TRUE.equals() メソッドの両方を使って、Boolean オブジェクトが null である可能性がある場合でも、その値を安全にチェックする方法を示しています。

Boolean オブジェクトを扱うときは、実行時エラーを避けるために、常に null の可能性を考慮することを忘れないでください。

まとめ

この実験では、Java でブール変数が true かどうかをチェックする方法を学びました。まず、等価演算子 == を使用して、ブール変数をブールリテラル true と直接比較する方法から始めました。これは、プリミティブ型のブール値の値をチェックする最も一般的で簡単な方法です。

また、null である可能性のある Boolean ラッパーオブジェクトの扱い方も調べました。オブジェクトの同一性のため、== を使って Boolean オブジェクトを true と直接比較すると、期待通りに動作しない場合があることを学びました。代わりに、equals() メソッドを使用するか、比較する前に Boolean オブジェクトをプリミティブ型のブール値にアンボクシングする必要があります。最後に、null である可能性のある Boolean オブジェクトを扱う際には、値にアクセスしようとする前に null をチェックすることで、潜在的な NullPointerException を処理する重要性について説明しました。