Java で文字列が null かどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

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

はじめに

この実験では、Java でヌル文字列 (null strings) を扱うための重要な技術を学びます。まず、等価演算子 (==) を使用してヌルをチェックする基本的な方法を探り、NullPointerException を防ぐためにこれがなぜ重要であるかを理解します。

これを基に、空文字列のチェックとヌルチェックを組み合わせて、さまざまな文字列の状態を効果的に扱う方法を学びます。最後に、潜在的にヌル値となる値を管理するための、より現代的で安全なアプローチとして Optional クラスを紹介し、コードの可読性を向上させ、一般的なエラーを防ぐ方法を示します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/StringManipulationGroup -.-> java/strings("Strings") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/operators -.-> lab-559988{{"Java で文字列が null かどうかをチェックする方法"}} java/variables -.-> lab-559988{{"Java で文字列が null かどうかをチェックする方法"}} java/if_else -.-> lab-559988{{"Java で文字列が null かどうかをチェックする方法"}} java/strings -.-> lab-559988{{"Java で文字列が null かどうかをチェックする方法"}} java/classes_objects -.-> lab-559988{{"Java で文字列が null かどうかをチェックする方法"}} java/object_methods -.-> lab-559988{{"Java で文字列が null かどうかをチェックする方法"}} java/string_methods -.-> lab-559988{{"Java で文字列が null かどうかをチェックする方法"}} end

等価演算子を使用したヌルチェック

このステップでは、Java の文字列変数が null かどうかを等価演算子 (==) を使用してチェックする方法を学びます。null を適切に扱う方法を理解することは、Java プログラミングにおいてエラーを防ぐために重要です。

Java では、参照型 (例えば String) の変数は null と呼ばれる特別な値を保持することができます。これは、その変数がメモリ内のどのオブジェクトも参照していないことを意味します。null 変数を有効なオブジェクトのように使用しようとすると、NullPointerException が発生します。これは初心者にとってよく見られる、厄介なエラーです。

文字列が null かどうかをチェックする最も簡単な方法は、等価演算子 (==) を使用することです。

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

  1. WebIDE を開き、~/project ディレクトリにいることを確認します。ターミナルのプロンプトを見るか、pwd と入力して Enter キーを押すことで確認できます。

  2. ~/project ディレクトリに NullCheck.java という名前の新しい Java ファイルを作成します。左側のファイルエクスプローラーで右クリックし、「New File」を選択して NullCheck.java と入力することで作成できます。

  3. NullCheck.java ファイルをエディターで開き、以下のコードを貼り付けます。

    public class NullCheck {
    
        public static void main(String[] args) {
    
            String myString1 = "Hello";
            String myString2 = null;
            String myString3 = ""; // This is an empty string, not null
    
            System.out.println("Checking myString1:");
            if (myString1 == null) {
                System.out.println("myString1 is null");
            } else {
                System.out.println("myString1 is not null");
            }
    
            System.out.println("\nChecking myString2:");
            if (myString2 == null) {
                System.out.println("myString2 is null");
            } else {
                System.out.println("myString2 is not null");
            }
    
            System.out.println("\nChecking myString3:");
            if (myString3 == null) {
                System.out.println("myString3 is null");
            } else {
                System.out.println("myString3 is not null");
            }
        }
    }

    このコードでは:

    • 3 つの String 変数を宣言しています。myString1 には通常の文字列が割り当てられ、myString2 には明示的に null が割り当てられ、myString3 には空文字列 ("") が割り当てられています。
    • if 文と等価演算子 (==) を使用して、各文字列が null かどうかをチェックしています。
    • 文字列が null かどうかを示すメッセージを出力しています。
  4. NullCheck.java ファイルを保存します (Ctrl+S または Cmd+S)。

  5. WebIDE の下部にあるターミナルを開きます。~/project ディレクトリにいることを確認します。

  6. javac コマンドを使用して Java プログラムをコンパイルします。

    javac NullCheck.java

    エラーがなければ、このコマンドにより同じディレクトリに NullCheck.class ファイルが作成されます。

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

    java NullCheck

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

    Checking myString1:
    myString1 is not null
    
    Checking myString2:
    myString2 is null
    
    Checking myString3:
    myString3 is not null

この出力は、myString1myString3null ではなく、myString2null であることを確認しています。null 文字列と空文字列 ("") の違いに注意することが重要です。空文字列は文字数がゼロの有効な String オブジェクトであり、null 文字列変数はどのオブジェクトも指していません。

== null を使用することは、Java で参照変数が null かどうかをチェックする標準的で正しい方法です。

ヌルチェックと空文字列チェックの組み合わせ

前のステップでは、文字列が null かどうかをチェックする方法を学びました。しかし、多くの実際のシナリオでは、文字列が (文字数がゼロ) であるか、空白文字のみを含んでいるかをチェックする必要がある場合もあります。null、空、または空白文字のみを含む文字列は、しばしば「空白」または「実質的に空」と見なされます。

null と空文字列の両方をチェックすることは一般的な要件です。論理和演算子 (||) を使用してこれらのチェックを組み合わせることができます。

前のプログラムを修正して、null と空文字列の両方をチェックするようにしましょう。

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

  2. main メソッドを修正して、空文字列のチェックを含め、チェックを組み合わせます。既存の main メソッドを以下のコードに置き換えます。

    public class NullCheck {
    
        public static void main(String[] args) {
    
            String myString1 = "Hello";
            String myString2 = null;
            String myString3 = ""; // This is an empty string
            String myString4 = "   "; // This string contains only whitespace
    
            System.out.println("Checking myString1:");
            if (myString1 == null || myString1.isEmpty()) {
                System.out.println("myString1 is null or empty");
            } else {
                System.out.println("myString1 is not null and not empty");
            }
    
            System.out.println("\nChecking myString2:");
            if (myString2 == null || myString2.isEmpty()) {
                System.out.println("myString2 is null or empty");
            } else {
                System.out.println("myString2 is not null and not empty");
            }
    
            System.out.println("\nChecking myString3:");
            if (myString3 == null || myString3.isEmpty()) {
                System.out.println("myString3 is null or empty");
            } else {
                System.out.println("myString3 is not null and not empty");
            }
    
            System.out.println("\nChecking myString4:");
            // Note: isEmpty() does not check for whitespace
            if (myString4 == null || myString4.isEmpty()) {
                System.out.println("myString4 is null or empty");
            } else {
                System.out.println("myString4 is not null and not empty");
            }
        }
    }

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

    • 空白文字のみを含む myString4 を追加しました。
    • myString == null || myString.isEmpty() という条件を使用して、文字列が null または空であるかをチェックします。isEmpty() メソッドは、文字列の長さが 0 の場合に true を返す組み込みの String メソッドです。
    • 重要: isEmpty() メソッドは、null ではない文字列に対してのみ呼び出すことができます。null 文字列に対して isEmpty() を呼び出そうとすると、NullPointerException が発生します。したがって、myString.isEmpty() を呼び出す前に、myString == null を使用して 最初に null をチェックすることが重要です。論理和演算子 (||) は「短絡評価」されます。つまり、最初の条件 (myString == null) が true の場合、2 番目の条件 (myString.isEmpty()) は評価されず、NullPointerException が防止されます。
  3. NullCheck.java ファイルを保存します。

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

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

    java NullCheck

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

    Checking myString1:
    myString1 is not null and not empty
    
    Checking myString2:
    myString2 is null or empty
    
    Checking myString3:
    myString3 is null or empty
    
    Checking myString4:
    myString4 is not null and not empty

このチェックでは、空白文字のみを含む myString4 は「null でも空でもない」と見なされることに注意してください。空白文字のみの文字列を「空白」と見なす必要がある場合は、isBlank() メソッド (Java 11 以降で利用可能) を使用することができます。

myString4isBlank() を使用するようにコードをすぐに更新しましょう。

  1. NullCheck.javamyString4 のチェックを修正します。

    // ... (previous code) ...
    
            System.out.println("\nChecking myString4 with isBlank():");
            if (myString4 == null || myString4.isBlank()) {
                System.out.println("myString4 is null or blank");
            } else {
                System.out.println("myString4 is not null and not blank");
            }
        }
    }
  2. ファイルを保存し、コンパイルして、再度実行します。

    javac NullCheck.java
    java NullCheck

    これで、myString4 の出力は次のようになるはずです。

    Checking myString4 with isBlank():
    myString4 is null or blank

これは、null と空/空白文字列のチェックを組み合わせる方法を示しています。これは Java プログラミングで非常に一般的なパターンです。

Optional を使用してヌル文字列を安全に扱う

前のステップでは、等価演算子 (==) と isEmpty() または isBlank() メソッドを使用して、null および空/空白の文字列をチェックしました。これらの方法は有効ですが、Java 8 では Optional クラスが導入され、潜在的に null の値をより明示的かつ関数型の方法で扱うことができるようになりました。Optional を使用すると、コードがより読みやすくなり、NullPointerException が発生する可能性が低くなります。

Optional は、null ではない値を含む場合と含まない場合があるコンテナオブジェクトです。値が存在する場合、isPresent()true を返し、get() はその値を返します。値が存在しない場合、オブジェクトは空と見なされ、isPresent()false を返します。空の Optional に対して get() を呼び出すと、NoSuchElementException がスローされます。

文字列で Optional を使用する方法を探ってみましょう。

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

  2. ファイルの内容全体を、Optional を使用する以下のコードに置き換えます。

    import java.util.Optional;
    
    public class NullCheck {
    
        public static void main(String[] args) {
    
            String myString1 = "Hello";
            String myString2 = null;
            String myString3 = "";
            String myString4 = "   ";
    
            // Creating Optional objects from strings
            Optional<String> optionalString1 = Optional.ofNullable(myString1);
            Optional<String> optionalString2 = Optional.ofNullable(myString2);
            Optional<String> optionalString3 = Optional.ofNullable(myString3);
            Optional<String> optionalString4 = Optional.ofNullable(myString4);
    
            System.out.println("Checking optionalString1:");
            if (optionalString1.isPresent()) {
                System.out.println("optionalString1 has a value: " + optionalString1.get());
            } else {
                System.out.println("optionalString1 is empty (contains null)");
            }
    
            System.out.println("\nChecking optionalString2:");
            if (optionalString2.isPresent()) {
                System.out.println("optionalString2 has a value: " + optionalString2.get());
            } else {
                System.out.println("optionalString2 is empty (contains null)");
            }
    
            System.out.println("\nChecking optionalString3:");
            // Optional.ofNullable("") creates an Optional containing an empty string
            if (optionalString3.isPresent()) {
                System.out.println("optionalString3 has a value: " + optionalString3.get());
            } else {
                System.out.println("optionalString3 is empty (contains null)");
            }
    
            System.out.println("\nChecking optionalString4:");
             if (optionalString4.isPresent()) {
                System.out.println("optionalString4 has a value: " + optionalString4.get());
            } else {
                System.out.println("optionalString4 is empty (contains null)");
            }
    
            // Using Optional methods for safer handling
            System.out.println("\nUsing Optional methods:");
    
            // orElse: provides a default value if the Optional is empty
            String value1 = optionalString1.orElse("Default Value");
            String value2 = optionalString2.orElse("Default Value");
            System.out.println("Value from optionalString1 (orElse): " + value1);
            System.out.println("Value from optionalString2 (orElse): " + value2);
    
            // ifPresent: performs an action if a value is present
            System.out.print("If optionalString1 is present: ");
            optionalString1.ifPresent(s -> System.out.println("Value is " + s));
    
            System.out.print("If optionalString2 is present: ");
            optionalString2.ifPresent(s -> System.out.println("Value is " + s));
    
            // filter: filters the value if present
            System.out.print("Filtered optionalString1 (length > 3): ");
            optionalString1.filter(s -> s.length() > 3).ifPresent(s -> System.out.println("Value is " + s));
    
            System.out.print("Filtered optionalString3 (length > 3): ");
            optionalString3.filter(s -> s.length() > 3).ifPresent(s -> System.out.println("Value is " + s));
        }
    }

    このコードでは:

    • Optional クラスをインポートしています。
    • Optional.ofNullable(string) を使用して、通常の String から Optional<String> を作成しています。このメソッドは、入力文字列が null であっても安全に使用できます。入力が null の場合、空の Optional を返します。そうでない場合、文字列が含まれた Optional を返します。
    • optionalString.isPresent() を使用して、Optional に値が含まれているかどうかをチェックしています。
    • optionalString.get() を使用して、値が存在する場合にその値を取得しています。注意: 空の Optional に対して get() を呼び出すと例外がスローされるため、常に isPresent() を最初にチェックするか、他の安全なメソッドを使用してください。
    • orElse(defaultValue) をデモンストレーションしています。これは、値が存在する場合はその値を返し、そうでない場合は指定されたデフォルト値を返します。
    • ifPresent(consumer) をデモンストレーションしています。これは、値が存在する場合に指定されたコンシューマー (1 つの引数を取り、結果を返さない関数) を実行します。
    • filter(predicate) をデモンストレーションしています。これは、値が存在し、指定された述語 (ブール値を返す関数) に一致する場合にその値を含む Optional を返し、そうでない場合は空の Optional を返します。
  3. NullCheck.java ファイルを保存します。

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

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

    java NullCheck

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

    Checking optionalString1:
    optionalString1 has a value: Hello
    
    Checking optionalString2:
    optionalString2 is empty (contains null)
    
    Checking optionalString3:
    optionalString3 has a value:
    
    Checking optionalString4:
    optionalString4 has a value:
    
    Using Optional methods:
    Value from optionalString1 (orElse): Hello
    Value from optionalString2 (orElse): Default Value
    If optionalString1 is present: Value is Hello
    If optionalString2 is present:
    Filtered optionalString1 (length > 3): Value is Hello
    Filtered optionalString3 (length > 3):

Optional を使用すると、値が存在しない可能性があることをコードでより明確に表現でき、明示的な null チェックを到処で行うことなく、値の存在または非存在を扱うための便利なメソッドが提供されます。Optional は強力なツールですが、すべての null チェックの代替にはなりません。ただし、null である可能性のある戻り値を扱う場合に特に有用です。

まとめ

この実験では、Java の文字列が null かどうかをチェックする方法を学びました。まず、等価演算子 (==) を使用して文字列変数を null と直接比較する方法を学びました。null はオブジェクト参照が存在しないことを意味し、null をチェックしないと NullPointerException が発生する可能性があることを理解しました。

次に、ヌルチェックと空文字列のチェックを組み合わせる方法を調べました。空文字列 ("") は null とは異なり、有効なオブジェクトであることを認識しました。最後に、Java 8 で導入された Optional クラスを使用する方法を学びました。これは、潜在的にヌル値を持つ値をより近代的かつ安全に扱う方法であり、値が欠落している可能性を明示的に示すことで、より堅牢で読みやすいコードを促進します。