概要

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 でラップし、デフォルト値付きで後続処理へ渡す

コード例

NullSafeStringHandler.java
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("   ", "空"));       // 空
    }
}

Java 8 / 17 / 21 の完全なサンプルコードは GitHub リポジトリ で確認できます。

Version Coverage

isBlank() / isEmpty() の使い分けが可能。Optional.filter(s -> !s.isBlank()) で null と空白を一括排除でき、コードが簡潔になる。

Java 17
// 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

標準 API(Objects / Optional)null チェックと空白判定だけで済む一般的な業務コード。依存を増やさずに対応したいとき。isBlank の Java 8 非対応や、Optional のネストが深くなる場合はコードが冗長になりやすい。
Apache Commons Lang(StringUtils)isBlank / defaultString / trimToNull など、null 安全なユーティリティを大量に使う場面。commons-lang3 への依存が加わる。標準 API で書ける範囲であれば、あえて追加する必要はない。
Guava(Strings)nullToEmpty / emptyToNull / isNullOrEmpty など、Google Guava を既にプロジェクトで使っている場合。Guava は JAR サイズが大きく、文字列ユーティリティだけのために導入するのは過剰。

注意点

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() と isBlank() はどう使い分けますか。

isEmpty() は長さ 0 の文字列だけを検出します。isBlank() はスペースやタブ、全角スペースのみの文字列も true を返します。フォーム入力のバリデーションでは isBlank() が適切です。

null チェックに Objects.requireNonNull を使うべきですか。

引数が null であってはならないメソッドの先頭で使うと、早期に NullPointerException を発生させられます。ただし戻り値の null 安全には Optional が向いています。

Optional.of と Optional.ofNullable の違いは何ですか。

Optional.of は null を渡すと即座に NullPointerException になります。null の可能性がある値には必ず ofNullable を使います。of は null でないことが保証されている場合にのみ使います。

関連書籍

この記事のテーマをさらに深く学びたい方へ。

※ Amazon アソシエイトリンクを含みます