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

JavaBeginner
オンラインで実践に進む

はじめに

この実験では、Java で Double オブジェクトが null かどうかをチェックする方法を学びます。プリミティブ型の double と Double ラッパークラスの違い、および潜在的な NullPointerException エラーの処理方法を探ります。

この実験では、等価演算子を使用して null をチェックする方法、null とゼロの値を区別する方法、およびより堅牢な null 処理のために Optional クラスを利用する方法を案内します。これらの概念を理解を深めるために、コード例を実装してテストします。

Double ラッパーの null チェック

このステップでは、Java で Double ラッパーオブジェクトを扱う方法を探ります。具体的には、Double 変数が null かどうかをチェックする方法に焦点を当てます。double のようなプリミティブ型とは異なり、Double のようなラッパークラスは null 値を保持することができます。これは値が存在しないことを表します。プログラムで NullPointerException エラーを防ぐために、null 値を正しく処理することが重要です。

Double オブジェクトの null チェックを実演するために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。開いていない場合は、左側のファイルエクスプローラーの ~/project ディレクトリの中にあります。

  2. 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 かどうかをチェックします。値を割り当てているので、この条件は偽になります。
  3. HelloJava.java ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、修正したプログラムをコンパイルします。WebIDE の下部にあるターミナルを開き、次のコマンドを実行します。

    javac HelloJava.java
    

    コンパイルが成功すると、何も出力されません。

  5. 最後に、コンパイルしたプログラムを実行します。

    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 プログラムを修正しましょう。

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

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

    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 ファイルを保存します。

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

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

    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> クラスを使って、割引の例を書き直しましょう。

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

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

    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 が空の場合を安全に扱う方法です。
  3. HelloJava.java ファイルを保存します。

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

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

    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 クラスを紹介しました。