はじめに
この実験では、Java でヌル文字列 (null strings) を扱うための重要な技術を学びます。まず、等価演算子 (==) を使用してヌルをチェックする基本的な方法を探り、NullPointerException を防ぐためにこれがなぜ重要であるかを理解します。
これを基に、空文字列のチェックとヌルチェックを組み合わせて、さまざまな文字列の状態を効果的に扱う方法を学びます。最後に、潜在的にヌル値となる値を管理するための、より現代的で安全なアプローチとして Optional クラスを紹介し、コードの可読性を向上させ、一般的なエラーを防ぐ方法を示します。
等価演算子を使用して null をテストする
このステップでは、Java の文字列変数が null かどうかを等価演算子 (==) を使用してチェックする方法を学びます。null を適切に扱う方法を理解することは、Java プログラミングにおいてエラーを防ぐために重要です。
Java では、参照型 (例えば String) の変数は null と呼ばれる特別な値を保持することができます。これは、その変数がメモリ内のどのオブジェクトも参照していないことを意味します。null 変数を有効なオブジェクトのように使用しようとすると、NullPointerException が発生します。これは初心者にとってよく見られる、厄介なエラーです。
文字列が null かどうかをチェックする最も簡単な方法は、等価演算子 (==) を使用することです。
これを実証するために、簡単な Java プログラムを作成しましょう。
WebIDE を開き、
~/projectディレクトリにいることを確認します。ターミナルのプロンプトを見るか、pwdと入力して Enter キーを押すことで確認できます。~/projectディレクトリにNullCheck.javaという名前の新しい Java ファイルを作成します。左側のファイルエクスプローラーで右クリックし、「New File」を選択してNullCheck.javaと入力することで作成できます。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かどうかを示すメッセージを出力しています。
- 3 つの
NullCheck.javaファイルを保存します (Ctrl+S または Cmd+S)。WebIDE の下部にあるターミナルを開きます。
~/projectディレクトリにいることを確認します。javacコマンドを使用して Java プログラムをコンパイルします。javac NullCheck.javaエラーがなければ、このコマンドにより同じディレクトリに
NullCheck.classファイルが作成されます。javaコマンドを使用してコンパイルされた Java プログラムを実行します。java NullCheck以下のような出力が表示されるはずです。
Checking myString1: myString1 is not null Checking myString2: myString2 is null Checking myString3: myString3 is not null
この出力は、myString1 と myString3 が null ではなく、myString2 が null であることを確認しています。null 文字列と空文字列 ("") の違いに注意することが重要です。空文字列は文字数がゼロの有効な String オブジェクトであり、null 文字列変数はどのオブジェクトも指していません。
== null を使用することは、Java で参照変数が null かどうかをチェックする標準的で正しい方法です。
ヌルチェックと空チェックを組み合わせる
前のステップでは、文字列が null かどうかをチェックする方法を学びました。しかし、多くの実際のシナリオでは、文字列が 空 (文字数がゼロ) であるか、空白文字のみを含んでいるかをチェックする必要がある場合もあります。null、空、または空白文字のみを含む文字列は、しばしば「空白」または「実質的に空」と見なされます。
null と空文字列の両方をチェックすることは一般的な要件です。論理和演算子 (||) を使用してこれらのチェックを組み合わせることができます。
前のプログラムを修正して、null と空文字列の両方をチェックするようにしましょう。
WebIDE のエディターで
NullCheck.javaファイルを開きます。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が防止されます。
- 空白文字のみを含む
NullCheck.javaファイルを保存します。ターミナルで修正したプログラムをコンパイルします。
javac NullCheck.javaコンパイルしたプログラムを実行します。
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 以降で利用可能) を使用することができます。
myString4 に isBlank() を使用するようにコードをすぐに更新しましょう。
NullCheck.javaのmyString4のチェックを修正します。// ... (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"); } } }ファイルを保存し、コンパイルして、再度実行します。
javac NullCheck.java java NullCheckこれで、
myString4の出力は次のようになるはずです。Checking myString4 with isBlank(): myString4 is null or blank
これは、null と空/空白文字列のチェックを組み合わせる方法を示しています。これは Java プログラミングで非常に一般的なパターンです。
Optional を使用して null 文字列を安全に扱う
前のステップでは、等価演算子 (==) と isEmpty() または isBlank() メソッドを使用して、null および空/空白の文字列をチェックしました。これらの方法は有効ですが、Java 8 では Optional クラスが導入され、潜在的に null の値をより明示的かつ関数型の方法で扱うことができるようになりました。Optional を使用すると、コードがより読みやすくなり、NullPointerException が発生する可能性が低くなります。
Optional は、null ではない値を含む場合と含まない場合があるコンテナオブジェクトです。値が存在する場合、isPresent() は true を返し、get() はその値を返します。値が存在しない場合、オブジェクトは空と見なされ、isPresent() は false を返します。空の Optional に対して get() を呼び出すと、NoSuchElementException がスローされます。
文字列で Optional を使用する方法を探ってみましょう。
WebIDE のエディターで
NullCheck.javaファイルを開きます。ファイルの内容全体を、
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を返します。
NullCheck.javaファイルを保存します。ターミナルでプログラムをコンパイルします。
javac NullCheck.javaプログラムを実行します。
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 クラスを使用する方法を学びました。これは、潜在的にヌル値を持つ値をより近代的かつ安全に扱う方法であり、値が欠落している可能性を明示的に示すことで、より堅牢で読みやすいコードを促進します。



