はじめに
この実験では、Java でブール変数が true
かどうかを確認する方法を学びます。等価演算子を使用した基本的な方法を探り、Boolean
ラッパークラスの扱いを深く掘り下げ、潜在的な null 値の管理方法についても議論します。
実践的な例を通じて、ブール値に基づく条件ロジックを記述する実践的な経験を積み、Java コードが堅牢でさまざまなシナリオを効果的に処理できるようにします。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Java でブール変数が true
かどうかを確認する方法を学びます。等価演算子を使用した基本的な方法を探り、Boolean
ラッパークラスの扱いを深く掘り下げ、潜在的な null 値の管理方法についても議論します。
実践的な例を通じて、ブール値に基づく条件ロジックを記述する実践的な経験を積み、Java コードが堅牢でさまざまなシナリオを効果的に処理できるようにします。
このステップでは、Java で等価演算子を使用してブール変数が true
かどうかを確認する方法を探ります。一見簡単に見えるかもしれませんが、細かい点を理解することは、クリーンで正しいコードを書くために重要です。
Java では、boolean
データ型は true
または false
の 2 つの値のいずれかを保持できます。ブール変数を持っている場合、プログラム内で決定を下すためにその値を確認する必要があることがよくあります。
ブール変数が true
かどうかを確認する最も一般的な方法は、等価演算子 ==
を使用することです。
これを実証するために、簡単な Java プログラムを作成しましょう。
WebIDE エディタで HelloJava.java
ファイルが開いていない場合は、開きます。
ファイルの内容全体を次のコードに置き換えます。
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 == true
が true
の場合に実行されます。else
: このキーワードは、if
条件が false
の場合に実行されるコードブロックを導入します。System.out.println("Java is not fun.");
: この行は、条件 isJavaFun == true
が false
の場合に実行されます。ファイルを保存します(Ctrl+S または Cmd+S)。
ターミナルで javac
コマンドを使用してプログラムをコンパイルします。
javac HelloJava.java
エラーがなければ、~/project
ディレクトリに HelloJava.class
ファイルが作成されます。
java
コマンドを使用してコンパイルされたプログラムを実行します。
java HelloJava
次の出力が表示されるはずです。
Java is fun!
これは、if
条件 isJavaFun == true
が true
と評価され、対応するメッセージが出力されたことを確認します。
== true
を使用することは完全に有効で理解しやすいですが、Java では true
のチェックを簡略化することができます。if
文はすでに括弧内の式をブール値として評価するため、ブール変数自体を条件として直接使用することができます。
この簡略化されたアプローチを使用するようにコードを変更しましょう。
エディタで再度 HelloJava.java
を開きます。
if
文を次のように変更します。
if (isJavaFun) {
System.out.println("Java is fun!");
} else {
System.out.println("Java is not fun.");
}
== true
を削除したことに注意してください。if (isJavaFun)
文は if (isJavaFun == true)
と等価です。
ファイルを保存します。
変更されたプログラムをコンパイルします。
javac HelloJava.java
プログラムを再度実行します。
java HelloJava
同じ出力が得られます。
Java is fun!
これは、if
条件でブール変数を直接使用することが、それが true
かどうかをチェックするより簡潔で慣用的な方法であることを示しています。
要するに、等価演算子 == true
を使用してブール値が true
かどうかを確認することができますが、より一般的でクリーンな方法は、単にブール変数自体を if
文の条件として使用することです。
前のステップでは、プリミティブ型の boolean
を扱いました。Java には、Boolean
という対応するラッパークラスもあります。ラッパークラスは、プリミティブデータ型をオブジェクトとして使用する方法を提供します。これは、コレクションを扱う場合や、null
である可能性のあるブール値を表す必要がある場合に特に便利です。
Boolean
クラスには、ブール値用の 2 つの事前定義されたオブジェクト Boolean.TRUE
と Boolean.FALSE
があります。これらは、それぞれブール値 true
と false
を表す定数オブジェクトです。
Boolean
オブジェクトを扱う場合でも、等価演算子 ==
を使用して比較することができます。ただし、==
がオブジェクトでどのように動作するかを理解することが重要です。オブジェクトに対して ==
は、2 つの変数がメモリ内の まったく同じオブジェクト を参照しているかどうかをチェックし、単に同じ値を持っているかどうかではありません。
プログラムを変更して Boolean
ラッパークラスを使用し、等価演算子がどのように動作するかを見てみましょう。
WebIDE エディタで HelloJava.java
ファイルを開きます。
コードを次のように置き換えます。
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 は自動的にプリミティブ型の boolean
値 true
を Boolean
オブジェクトに変換します。if (anotherBooleanObject == Boolean.TRUE)
: 再び ==
を使用して anotherBooleanObject
を Boolean.TRUE
と比較します。オートボクシングの仕組みと Java の Boolean
値のキャッシュにより、true
と false
の値については、オートボクシングされた Boolean
オブジェクトはしばしば Boolean.TRUE
と Boolean.FALSE
と同じキャッシュされたインスタンスを参照します。したがって、この条件もおそらく true
になります。ファイルを保存します。
プログラムをコンパイルします。
javac HelloJava.java
プログラムを実行します。
java HelloJava
次の出力が表示されるはずです。
Java is fun (using Boolean.TRUE)!
Another boolean object is true!
これは、==
を Boolean.TRUE
との比較に使用すると、これらのケースでは期待通りに動作することを確認します。なぜなら、変数はおそらく同じ基礎となる Boolean.TRUE
オブジェクトを参照しているからです。
ただし、Boolean
オブジェクトの比較に ==
を依存することは、より複雑なシナリオでは危険な場合があります。特に、Boolean
オブジェクトが異なる方法で作成された場合や、異なるソースから来た場合です。Boolean
オブジェクトの値の等価性を比較するより安全で推奨される方法は、.equals()
メソッドを使用することです。
コードを変更して .equals()
を使用しましょう。
エディタで HelloJava.java
を開きます。
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()
メソッドは、オブジェクトの 値 を比較し、メモリ位置ではありません。
ファイルを保存します。
プログラムをコンパイルします。
javac HelloJava.java
プログラムを実行します。
java HelloJava
次の出力が表示されるはずです。
Java is fun (using equals)!
Another boolean object is true (using equals)!
.equals()
を使用することは、Boolean
オブジェクトの値の等価性を比較する標準的で最も安全な方法です。
要するに、キャッシュのために ==
が Boolean
オブジェクトと Boolean.TRUE
の比較に機能する場合がありますが、.equals()
メソッドは、Boolean
オブジェクトが true
の値を表しているかどうかをチェックするための推奨される、より信頼性の高い方法です。
前のステップでは、Boolean
ラッパークラスについて学びました。プリミティブ型の boolean
と Boolean
ラッパークラスの主な違いの 1 つは、Boolean
変数は null
値を保持できるのに対し、プリミティブ型の boolean
は保持できないことです。Java では、NullPointerException
エラーを防ぐために、null
値を適切に扱うことが重要です。
NullPointerException
は、現在 null
を指している変数を有効なオブジェクトのように使用しようとしたときに発生します。たとえば、null
オブジェクトに対してメソッドを呼び出すと、NullPointerException
が発生します。
Boolean
オブジェクトが true
かどうかをチェックするときは、オブジェクトが null
である可能性がある場合は注意が必要です。
これまで学んだ方法を使って null
の Boolean
をチェックしようとするとどうなるか見てみましょう。
WebIDE エディタで HelloJava.java
ファイルを開きます。
コードを次のように置き換えます。
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)
: 等価演算子 ==
を使用して、null
の Boolean
をプリミティブ型の true
と比較します。Boolean
オブジェクト(null
であっても)をプリミティブ型の boolean
と比較するとき、Java は「アンボクシング」を行います。つまり、Boolean
オブジェクトをプリミティブ型の boolean
に変換しようとします。Boolean
オブジェクトが null
の場合、このアンボクシング処理は NullPointerException
を引き起こします。.equals()
のチェックも NullPointerException
を引き起こします。なぜなら、null
オブジェクト(nullableBoolean
)に対して .equals()
メソッドを呼び出そうとしているからです。ファイルを保存します。
プログラムをコンパイルします。
javac HelloJava.java
プログラムを実行します。
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
かどうかを安全にチェックする方法は次の通りです。
エディタで HelloJava.java
を開きます。
コードを次のように置き換えます。
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
を使って nullableBoolean
が null
でないことをチェックします。&&
演算子は、条件の第 2 部(nullableBoolean == true
)は、第 1 部(nullableBoolean != null
)が true
の場合にのみ評価されることを意味します。これにより NullPointerException
が防止されます。nullableBoolean
が null
の場合、第 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
を返します。ファイルを保存します。
プログラムをコンパイルします。
javac HelloJava.java
プログラムを実行します。
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
を処理する重要性について説明しました。