概要
Java の文字列処理で最も頻繁に遭遇するトラブルが NullPointerException です。データベースから取得した値、外部 API のレスポンス、画面入力のパラメータなど、null が紛れ込む経路は多岐にわたります。加えて、空文字 "" とスペースだけの文字列 " " を区別すべき場面も少なくありません。この記事では、Objects.toString によるデフォルト値の設定、定数を左辺に置く equals の書き方、Java 11 以降の isBlank と isEmpty の使い分け、Optional を活用したチェーン処理といった実装パターンを整理します。Java 8 で使える方法から Java 21 の switch 式での null ハンドリングまで、バージョンごとの書き方の違いも押さえます。
使いどころ
CSV 取込時に空欄・空白のみのセルを一律 null として正規化し、後続の業務ロジックで NullPointerException を防ぐ
画面入力のフォームで氏名・住所などの必須項目に対し、null・空文字・全角スペースのみを同一視してバリデーションする
外部 API のレスポンス JSON で、欠落フィールドや空文字を Optional でラップし、デフォルト値付きで後続処理へ渡す
コード例
import java.util.Objects;
import java.util.Optional;
public class NullSafeStringHandler {
/** null・空文字・空白のいずれかならデフォルト値を返す */
public static String blankToDefault(String value, String defaultValue) {
if (value == null || value.isBlank()) {
return defaultValue;
}
return value;
}
/** null 安全な equals(定数を左辺に置く) */
public static boolean safeEquals(String target, String value) {
return target.equals(value);
}
/** Objects.toString でデフォルト値付きの変換 */
public static String toStringOrDefault(Object obj, String defaultValue) {
return Objects.toString(obj, defaultValue);
}
/** Optional で null と空白を排除し、変換を適用する */
public static String transformOrDefault(String input, String defaultValue) {
return Optional.ofNullable(input)
.filter(s -> !s.isBlank())
.map(String::trim)
.orElse(defaultValue);
}
public static void main(String[] args) {
// null / 空文字 / 空白のデフォルト値変換
System.out.println(blankToDefault(null, "未入力")); // 未入力
System.out.println(blankToDefault("", "未入力")); // 未入力
System.out.println(blankToDefault(" ", "未入力")); // 未入力
System.out.println(blankToDefault("山田", "未入力")); // 山田
// null 安全な比較
System.out.println(safeEquals("admin", null)); // false
System.out.println(safeEquals("admin", "admin")); // true
// Objects.toString
System.out.println(toStringOrDefault(null, "N/A")); // N/A
System.out.println(toStringOrDefault(42, "N/A")); // 42
// Optional を使った変換
System.out.println(transformOrDefault(" hello ", "空")); // hello
System.out.println(transformOrDefault(null, "空")); // 空
System.out.println(transformOrDefault(" ", "空")); // 空
}
}Version Coverage
isBlank() / isEmpty() の使い分けが可能。Optional.filter(s -> !s.isBlank()) で null と空白を一括排除でき、コードが簡潔になる。
// Java 17: isBlank() で全角スペースも検出
if (str == null || str.isBlank()) {
return "デフォルト値";
}
// Optional + isBlank で簡潔に
String result = Optional.ofNullable(str)
.filter(s -> !s.isBlank())
.map(String::toUpperCase)
.orElse("空でした");Library Comparison
注意点
isEmpty() は null に対して呼ぶと NullPointerException になる。null チェックを先に行うか、Objects.toString で変換してから呼ぶこと
isBlank() は Java 11 以降でしか使えない。Java 8 環境では trim().isEmpty() で代用するが、全角スペースは除去されない点に注意
Optional.ofNullable(str).orElse("default") は str が空文字 "" のときに "default" を返さない。空文字も除外したい場合は filter を挟む必要がある
"target".equals(variable) のように定数を左辺に置く書き方は null 安全だが、可読性とのトレードオフがある。チーム内で方針を揃えておくこと
FAQ
isEmpty() は長さ 0 の文字列だけを検出します。isBlank() はスペースやタブ、全角スペースのみの文字列も true を返します。フォーム入力のバリデーションでは isBlank() が適切です。
引数が null であってはならないメソッドの先頭で使うと、早期に NullPointerException を発生させられます。ただし戻り値の null 安全には Optional が向いています。
Optional.of は null を渡すと即座に NullPointerException になります。null の可能性がある値には必ず ofNullable を使います。of は null でないことが保証されている場合にのみ使います。