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

JavaJavaBeginner
今すぐ練習

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

はじめに

この実験では、Java でオブジェクトが null かどうかをチェックする基本的な手法を学びます。これは NullPointerException エラーを防ぐための基本的なスキルです。まず、最も基本的な方法を探ります。つまり、等価演算子 (==) を使って参照変数を null と直接比較する方法です。

これを基に、null チェックと型チェックを組み合わせて、オブジェクトの存在と正しい型の両方を確認する方法を調べます。最後に、Optional クラスの使用について詳しく見ていきます。これは Java の最新機能で、潜在的に null の値を扱うための、より慣用的で安全な方法を提供し、より堅牢で読みやすいコードを促進します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/BasicSyntaxGroup -.-> java/type_casting("Type Casting") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/data_types -.-> lab-560011{{"Java でオブジェクトが null かどうかをチェックする方法"}} java/operators -.-> lab-560011{{"Java でオブジェクトが null かどうかをチェックする方法"}} java/variables -.-> lab-560011{{"Java でオブジェクトが null かどうかをチェックする方法"}} java/if_else -.-> lab-560011{{"Java でオブジェクトが null かどうかをチェックする方法"}} java/type_casting -.-> lab-560011{{"Java でオブジェクトが null かどうかをチェックする方法"}} java/classes_objects -.-> lab-560011{{"Java でオブジェクトが null かどうかをチェックする方法"}} java/object_methods -.-> lab-560011{{"Java でオブジェクトが null かどうかをチェックする方法"}} end

等価演算子を使った null チェック

このステップでは、Java で null をチェックする最も基本的な方法の 1 つ、等価演算子 (==) の使用を探ります。null を扱う方法を理解することは、Java プログラミングにおいてエラーを防ぐために重要です。

Java では、null は参照変数がどのオブジェクトも指していないことを示す特別な値です。変数を箱、オブジェクトを箱の中に入れるものと考えてください。箱が空の場合、その変数は null です。null 参照を使用しようとする(空の箱から何かを使おうとするようなもの)と、多くの場合 NullPointerException が発生します。これは初心者にとって一般的で厄介なエラーです。

等価演算子を使って null をチェックする方法を示すために、簡単な Java プログラムを作成しましょう。

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

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

    public class HelloJava {
        public static void main(String[] args) {
            String message = null; // Declaring a String variable and setting it to null
    
            // Checking if the message variable is null using the equality operator
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is: " + message);
            }
    
            message = "Hello, World!"; // Assigning a String object to the variable
    
            // Checking again after assigning a value
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is: " + message);
            }
        }
    }

    このコードでは、以下のことを行っています。

    • message という名前の String 変数を宣言し、最初に null に設定します。
    • 等価演算子 (==) を使った if 文で、messagenull かどうかをチェックします。
    • message == null が真の場合、「The message is null.」を出力します。
    • 偽の場合、メッセージ自体を出力します。
    • その後、文字列「Hello, World!」を message 変数に代入します。
    • 再度 null チェックを行い、異なる出力を確認します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

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

    javac HelloJava.java

    エラーがなければ、コンパイルは成功します。

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

    java HelloJava

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

    The message is null.
    The message is: Hello, World!

    この出力は、== を使った null チェックが正しく機能したことを確認します。messagenull のとき、最初の if 条件は真でした。値を代入した後、2 番目の if 条件は偽になり、else ブロックが実行されました。

等価演算子 (==) を使うことは、Java で参照変数が null かどうかをチェックする標準的で推奨される方法です。この方法は簡単で明確で、効率的です。

null チェックと型チェックの組み合わせ

このステップでは、null チェックとオブジェクトの型チェックを組み合わせる方法を学びます。オブジェクトを受け取り、それを使用する前に null でないことと特定の型であることを確認する必要がある場合、これは一般的なシナリオです。

Java では、オブジェクトが特定のクラスのインスタンスであるか、特定のインターフェースを実装しているかをチェックするために instanceof 演算子が提供されています。これを論理 AND 演算子 (&&) を使って null チェックと組み合わせることができます。

これを示すために、HelloJava.java プログラムを変更しましょう。

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

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

    public class HelloJava {
        public static void main(String[] args) {
            Object myObject = "This is a String"; // Declaring an Object variable
    
            // Checking if myObject is not null AND is an instance of String
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject; // Casting the Object to a String
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
    
            myObject = null; // Setting the object to null
    
            // Checking again after setting to null
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject;
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
    
            myObject = 123; // Setting the object to an Integer
    
            // Checking again after setting to an Integer
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject;
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
        }
    }

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

    • Object 型の変数 myObject を宣言します。Object は Java ですべてのクラスの基底クラスであり、任意のオブジェクトへの参照を保持できます。
    • 最初に myObjectString を代入します。
    • if 条件 myObject != null && myObject instanceof String は 2 つのことをチェックします。
      • myObject != null:オブジェクト参照が null ではないか?
      • myObject instanceof String:オブジェクトが String クラスのインスタンスであるか?
    • && 演算子は、if ブロック内のコードを実行するために両方の条件が真でなければならないことを意味します。
    • 両方が真の場合、(String) myObject を使って myObjectString にキャストし、メッセージを出力します。myObjectObject として宣言されているため、キャストが必要です。コンパイラに、実際には String であることを知っていることを伝え、それを String として扱うことができるようにするためです。
    • いずれかの条件が偽の場合(オブジェクトが null または String ではない場合)、else ブロックが実行されます。
    • その後、myObjectnull に設定し、次に IntegerString ではない)に設定して if 条件をテストします。
  3. ファイルを保存します。

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

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

    java HelloJava

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

    The object is a non-null String: This is a String
    The object is null or not a String.
    The object is null or not a String.

    この出力は、if 条件がオブジェクトが null でない String である場合と、null または String ではない場合を正しく識別したことを示しています。

!= nullinstanceof を組み合わせることは、特定の型であり、かつ null である可能性のあるオブジェクトを安全に扱う必要がある場合の Java の標準的なパターンです。

Optional を使った null の扱い

このステップでは、Java 8 で導入された、Java で潜在的な null 値を扱うより現代的なアプローチである Optional クラスを探ります。Optional は、null ではない値を含む場合と含まない場合があるコンテナオブジェクトです。値の存在または不存在をより明示的に表現する方法を提供し、NullPointerException のリスクを減らすのに役立ちます。

Optional を使用することで、値が存在しない可能性を考慮し、その場合を適切に処理するように促されます。コード全体に散らばった null チェックに依存するのではなくです。

HelloJava.java プログラムを変更して Optional を使用しましょう。

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

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

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Creating an Optional that contains a value
            Optional<String> optionalMessageWithValue = Optional.of("Hello from Optional!");
    
            // Creating an Optional that is empty (represents null)
            Optional<String> optionalMessageWithoutValue = Optional.empty();
    
            // Handling the Optional with a value
            if (optionalMessageWithValue.isPresent()) {
                String message = optionalMessageWithValue.get(); // Get the value if present
                System.out.println("Optional with value: " + message);
            } else {
                System.out.println("Optional with value is empty.");
            }
    
            // Handling the Optional without a value
            if (optionalMessageWithoutValue.isPresent()) {
                String message = optionalMessageWithoutValue.get();
                System.out.println("Optional without value: " + message);
            } else {
                System.out.println("Optional without value is empty.");
            }
    
            // A more concise way to handle Optional using ifPresent
            optionalMessageWithValue.ifPresent(msg -> System.out.println("Using ifPresent: " + msg));
    
            // Using orElse to provide a default value if Optional is empty
            String messageOrDefault = optionalMessageWithoutValue.orElse("Default Message");
            System.out.println("Using orElse: " + messageOrDefault);
        }
    }

    このコードでは、以下のことを行っています。

    • Optional クラスをインポートします。
    • Optional.of() を使って値を含む Optional<String> を作成します。なお、Optional.of()null を渡すと NullPointerException をスローします。値が null である可能性がある場合は、代わりに Optional.ofNullable() を使用してください。
    • Optional.empty() を使って空の Optional<String> を作成します。
    • optionalMessageWithValue.isPresent() を使って Optional が値を含んでいるかどうかをチェックします。含んでいる場合、optionalMessageWithValue.get() を使って値を取得できます。注意: 空の Optional に対して get() を呼び出すと NoSuchElementException がスローされます。
    • 同様に、空の Optional の処理を示します。
    • ifPresent() を示します。これは、値が存在する場合にのみ指定されたアクションを実行します。これは、値が存在する場合にその値に対してアクションを実行するクリーンな方法です。
    • orElse() を示します。これは、値が存在する場合はその値を返し、そうでない場合はデフォルト値を返します。これは、フォールバック値を提供するのに便利です。
  3. ファイルを保存します。

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

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

    java HelloJava

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

    Optional with value: Hello from Optional!
    Optional without value is empty.
    Using ifPresent: Hello from Optional!
    Using orElse: Default Message

    この出力は、Optional が従来の null チェックと比較して、値の存在または不存在をより明示的かつ安全に扱う方法を示しています。Optional はすべての null チェックの代替にはなりませんが、値が存在しないことが有効で予想されるシナリオで API を設計したりコードを書いたりするための貴重なツールです。

まとめ

この実験では、Java でオブジェクトが null かどうかをチェックする基本的な技術を学びました。まず、最も基本的な方法を探りました。つまり、等価演算子 (==) を使って参照変数を null と直接比較する方法です。この単純なチェックは、NullPointerException エラーを防ぐために不可欠です。

その後、より高度なシナリオに移りましたが、提供された内容では基本的な等価チェックのみが詳述されています。完全な実験では、null チェックと型チェックを組み合わせることや、Optional クラスを利用することがカバーされるでしょう。Optional クラスは、潜在的な null 値をより適切かつ明示的に扱うために設計された Java の最新機能であり、クリーンで安全なコードを促進します。