はじめに
この実験では、Java で Double オブジェクトが null かどうかをチェックする方法を学びます。プリミティブ型の double と Double ラッパークラスの違い、および潜在的な NullPointerException エラーの処理方法を探ります。
この実験では、等価演算子を使用して null をチェックする方法、null とゼロの値を区別する方法、およびより堅牢な null 処理のために Optional クラスを利用する方法を案内します。これらの概念を理解を深めるために、コード例を実装してテストします。
Double ラッパーの null チェック
このステップでは、Java で Double ラッパーオブジェクトを扱う方法を探ります。具体的には、Double 変数が null かどうかをチェックする方法に焦点を当てます。double のようなプリミティブ型とは異なり、Double のようなラッパークラスは null 値を保持することができます。これは値が存在しないことを表します。プログラムで NullPointerException エラーを防ぐために、null 値を正しく処理することが重要です。
Double オブジェクトの null チェックを実演するために、簡単な Java プログラムを作成しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。開いていない場合は、左側のファイルエクスプローラーの~/projectディレクトリの中にあります。HelloJava.javaの既存のコードを次のコードに置き換えます。public class HelloJava { public static void main(String[] args) { Double price = null; // Declare a Double variable and initialize it to null if (price == null) { System.out.println("Price is not set (it is null)."); } else { System.out.println("Price is set to: " + price); } Double quantity = 10.5; // Declare another Double variable and give it a value if (quantity == null) { System.out.println("Quantity is not set (it is null)."); } else { System.out.println("Quantity is set to: " + quantity); } } }このコードの新しい部分を見てみましょう。
Double price = null;:Double型のpriceという名前の変数を宣言し、null値を割り当てます。if (price == null):これはprice変数がnullと等しいかどうかをチェックするif文です。==演算子は、オブジェクトへの参照がnullかどうかを比較するために使用されます。System.out.println("Price is not set (it is null).");:この行は、priceが実際にnullの場合に実行されます。Double quantity = 10.5;:quantityという名前の別のDouble変数を宣言し、数値を割り当てます。- 2 番目の
if文は、quantityがnullかどうかをチェックします。値を割り当てているので、この条件は偽になります。
HelloJava.javaファイルを保存します(Ctrl+S または Cmd+S)。次に、修正したプログラムをコンパイルします。WebIDE の下部にあるターミナルを開き、次のコマンドを実行します。
javac HelloJava.javaコンパイルが成功すると、何も出力されません。
最後に、コンパイルしたプログラムを実行します。
java HelloJava次の出力が表示されるはずです。
Price is not set (it is null). Quantity is set to: 10.5この出力は、プログラムが
priceがnullであり、quantityに値があることを正しく識別したことを確認します。
null をチェックする方法を理解することは、Java オブジェクト、特にラッパークラスを扱う際の基本です。次のステップでは、null の Double と値がゼロの Double の違いを探ります。
null 値とゼロ値の扱い
前のステップでは、Double ラッパーオブジェクトが null かどうかをチェックする方法を学びました。今度は、Double が null である場合と、Double の値がゼロ (0.0) である場合の違いを探りましょう。この区別は重要です。なぜなら、null は「値がない」ことを意味し、0.0 は特定の数値です。
商品に適用される割引を追跡するシナリオを考えてみましょう。null の割引は、割引情報が利用できないことを意味するかもしれません。一方、0.0 の割引は、明確に割引が適用されていないことを意味します。
この違いを実演するために、HelloJava.java プログラムを修正しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。既存のコードを次のコードに置き換えます。
public class HelloJava { public static void main(String[] args) { Double discount = null; // Discount information not available if (discount == null) { System.out.println("Discount information is not available (it is null)."); } else if (discount == 0.0) { System.out.println("There is no discount (value is 0.0)."); } else { System.out.println("Discount applied: " + discount); } System.out.println("---"); // Separator for clarity Double zeroDiscount = 0.0; // Explicitly no discount if (zeroDiscount == null) { System.out.println("Discount information is not available (it is null)."); } else if (zeroDiscount == 0.0) { System.out.println("There is no discount (value is 0.0)."); } else { System.out.println("Discount applied: " + zeroDiscount); } System.out.println("---"); // Separator for clarity Double appliedDiscount = 5.5; // A specific discount value if (appliedDiscount == null) { System.out.println("Discount information is not available (it is null)."); } else if (appliedDiscount == 0.0) { System.out.println("There is no discount (value is 0.0)."); } else { System.out.println("Discount applied: " + appliedDiscount); } } }この更新されたコードでは、以下のことを行っています。
- 3 つの
Double変数を導入しています。discount(nullで初期化)、zeroDiscount(0.0で初期化)、およびappliedDiscount(5.5で初期化)です。 if-else if-else構造を使用して、各変数の状態をチェックしています。- まず、変数が
nullかどうかをチェックします。 nullでない場合、その値が0.0かどうかをチェックします。- それ以外の場合は、特定の割引値が適用されていると想定します。
- まず、変数が
- 3 つの
HelloJava.javaファイルを保存します。ターミナルでプログラムをコンパイルします。
javac HelloJava.javaコンパイルしたプログラムを実行します。
java HelloJava次の出力が表示されるはずです。
Discount information is not available (it is null). --- There is no discount (value is 0.0). --- Discount applied: 5.5この出力は、Java が
nullのDoubleと値が0.0のDoubleをどのように区別するかを明確に示しています。これらのケースを正しく処理することは、堅牢な Java アプリケーションを作成するために不可欠です。
次のステップでは、潜在的な null 値を扱うためのより現代的なアプローチとして、Optional クラスを使用する方法を探ります。これにより、コードをより安全で読みやすくすることができます。
Optional クラスを使ったテスト
最新の Java(Java 8 以降)では、Optional クラスが、値が存在する場合と存在しない場合の両方を表すためによく使われます。これは、単に null 参照を使うよりも、潜在的な null 値をより明示的かつ安全に扱う方法を提供します。Optional を使うことで、NullPointerException エラーを防ぎ、コードをより読みやすくすることができます。
Optional<Double> クラスを使って、割引の例を書き直しましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。既存のコードを次のコードに置き換えます。
import java.util.Optional; public class HelloJava { public static void main(String[] args) { // Representing a discount that might be null Optional<Double> optionalDiscount = Optional.empty(); if (optionalDiscount.isPresent()) { System.out.println("Discount is present: " + optionalDiscount.get()); } else { System.out.println("Discount is not present (Optional is empty)."); } System.out.println("---"); // Separator for clarity // Representing a discount with a value of 0.0 Optional<Double> optionalZeroDiscount = Optional.of(0.0); if (optionalZeroDiscount.isPresent()) { System.out.println("Discount is present: " + optionalZeroDiscount.get()); } else { System.out.println("Discount is not present (Optional is empty)."); } System.out.println("---"); // Separator for clarity // Representing a discount with a specific value Optional<Double> optionalAppliedDiscount = Optional.of(5.5); if (optionalAppliedDiscount.isPresent()) { System.out.println("Discount is present: " + optionalAppliedDiscount.get()); } else { System.out.println("Discount is not present (Optional is empty)."); } System.out.println("---"); // Separator for clarity // A common way to handle Optional: using orElse Double finalDiscount = optionalDiscount.orElse(0.0); System.out.println("Using orElse: Final discount is " + finalDiscount); Double finalZeroDiscount = optionalZeroDiscount.orElse(0.0); System.out.println("Using orElse: Final zero discount is " + finalZeroDiscount); } }主な変更点を見てみましょう。
import java.util.Optional;:Optionalクラスをインポートします。Optional<Double> optionalDiscount = Optional.empty();:空のOptional<Double>を作成し、割引値が存在しないことを表します。Optional<Double> optionalZeroDiscount = Optional.of(0.0);:値0.0を含むOptional<Double>を作成します。Optional.of()は、値がnullでないことが確実な場合に使います。Optional<Double> optionalAppliedDiscount = Optional.of(5.5);:値5.5を含むOptional<Double>を作成します。optionalDiscount.isPresent():このメソッドは、Optionalに値が含まれているかどうかをチェックします。nullと比較する代わりに、この方法を使うことが推奨されます。optionalDiscount.get():このメソッドは、Optionalから値を取得します。注意:Optionalが空の場合、get()を呼び出すとNoSuchElementExceptionがスローされます。get()を呼び出す前に常にisPresent()をチェックするか、orElse()のような代替メソッドを使ってください。optionalDiscount.orElse(0.0):このメソッドは、Optionalに値が含まれている場合はその値を返し、そうでない場合は提供されたデフォルト値(この場合は0.0)を返します。これは、値を取得し、Optionalが空の場合を安全に扱う方法です。
HelloJava.javaファイルを保存します。ターミナルでプログラムをコンパイルします。
javac HelloJava.javaコンパイルしたプログラムを実行します。
java HelloJava次の出力が表示されるはずです。
Discount is not present (Optional is empty). --- Discount is present: 0.0 --- Discount is present: 5.5 --- Using orElse: Final discount is 0.0 Using orElse: Final zero discount is 0.0この出力は、
Optionalが値が欠けている場合を明示的に扱うのにどのように役立つかを示しています。Optionalを使うことで、NullPointerExceptionのリスクを減らし、クリーンで堅牢なコードを書くことができます。
これで、Double ラッパーオブジェクトの null をチェックする方法、null とゼロの値を区別する方法、そして潜在的に欠けている値を安全に扱うために Optional クラスを使う方法を学びました。これらは、信頼性の高い Java コードを書くための重要な概念です。
まとめ
この実験では、Java の Double ラッパーオブジェクトが null かどうかをチェックする方法を学びました。プリミティブ型の double とは異なり、Double は null 値を保持できることがわかりました。== null の比較を使って Double 変数に値がないことをチェックし、潜在的な NullPointerException エラーを防ぐ方法を実演しました。また、Double オブジェクトの null 値とゼロ値の違い、および両方のケースを適切に扱う方法を探りました。最後に、潜在的な null 値をより明示的かつ安全に扱うための最新の Java のアプローチとして、Optional クラスを紹介しました。



