【Java】trimで空白のみの文字列はどうなる?全角スペースの落とし穴とstrip・isBlank

Javaの trim() は文字列の前後の空白を取り除く定番メソッドですが、「空白のみの文字列を渡すとどうなるか」「全角スペースも消えるのか」を正しく理解していないと、入力チェックで思わぬ不具合を招きます。この記事では、trim() の挙動を正確に押さえたうえで、全角スペースの落とし穴と、Java 11以降の strip()isBlank() による正しい空白判定までまとめます。

この記事の結論:trim() に空白のみの文字列を渡すと空文字(""が返ります。ただし trim() が消すのはコード値が U+0020 以下の文字だけで、全角スペース( )は除去されません。空白のみかを正しく判定するなら、Java 11以降のisBlank() を使います。
スポンサーリンク

trim()の基本的な使い方

まず基本の動きです。trim() は文字列の先頭と末尾の空白を取り除き、間にある空白はそのまま残します。

trim()の基本
String str = "  Hello, World!  ";
String trimmed = str.trim();

System.out.println("'" + str + "'");      // '  Hello, World!  '
System.out.println("'" + trimmed + "'");  // 'Hello, World!'

空白のみの文字列にtrim()を適用すると

半角スペースだけで構成された文字列に trim() を適用すると、すべて取り除かれて長さ0の空文字(""が返ります。null になるわけではない点に注意してください。

空白のみ → 空文字
String str = "   ";
String trimmed = str.trim();

System.out.println(trimmed.isEmpty()); // true
System.out.println(trimmed.length());  // 0
System.out.println(trimmed == null);   // false(空文字であってnullではない)
そのため「入力が空白だけかどうか」を判定する古い書き方として str.trim().isEmpty() がよく使われてきました。空判定そのものはisEmptyメソッドの使い方、nullの判定はisNullでnullの判定を行う方法を参照してください。

落とし穴:trim()は全角スペースを消さない

ここが最大の注意点です。trim() が除去するのはコード値が U+0020(半角スペース)以下の文字だけです。タブや改行は消えますが、全角スペース( =U+3000)は U+0020 より大きいため除去されません

全角スペースは残る
String zen = "  Hello  "; // 前後は全角スペース
System.out.println("'" + zen.trim() + "'"); // '  Hello  '(変化なし)

String onlyZen = "  ";       // 全角スペースのみ
System.out.println(onlyZen.trim().isEmpty()); // false(空にならない!)
System.out.println(onlyZen.trim().length());  // 2
全角スペースだけの入力は trim().isEmpty() をすり抜けます。フォームに全角スペースだけ入力された場合、str.trim().isEmpty()false を返すため、「未入力」として弾けません。全角スペースまで考慮するなら、次の strip() / isBlank() を使います。

Java 11以降はstrip()・isBlank()が確実

Java 11で追加された strip() 系と isBlank() は、Unicodeの空白判定(Character.isWhitespaceに基づくため、全角スペースも空白として扱います。

メソッド 除去/判定の対象 全角スペース
trim() U+0020 以下の文字 残る(消えない)
strip() Unicodeの空白文字 消える
stripLeading() 先頭側のUnicode空白 消える
stripTrailing() 末尾側のUnicode空白 消える
isBlank() 空 or 空白のみかを判定 空白として扱う
strip()とisBlank()
String zen = "  Hello  ";
System.out.println("'" + zen.strip() + "'"); // 'Hello'(全角スペースも除去)

// 「空白のみか」の判定は isBlank() が最も簡単
System.out.println("   ".isBlank());  // true(半角スペースのみ)
System.out.println("  ".isBlank()); // true(全角スペースのみ)
System.out.println("".isBlank());     // true(空文字)
System.out.println("a".isBlank());    // false
「未入力(空白のみ)かどうか」を判定したいなら isBlank() が最適です。全角スペースだけの入力も正しく「空白のみ」と判定できます。Java 10以前で isBlank() が使えない場合は、Apache Commons Lang の StringUtils.isBlank() も同じ目的で使えます。

nullに注意する

trim()strip() は文字列のメソッドなので、対象が null だと NullPointerException が発生します。判定の前に null チェックを入れましょう。

null安全に空白判定する
static boolean isEmptyOrBlank(String s) {
    return s == null || s.isBlank();
}

System.out.println(isEmptyOrBlank(null));  // true
System.out.println(isEmptyOrBlank(" "));  // true
System.out.println(isEmptyOrBlank(" a ")); // false

よくある質問(FAQ)

Qtrim()に空白のみの文字列を渡すとnullになりますか?
Aなりません。長さ0の空文字(""が返ります。trimmed == nullfalsetrimmed.isEmpty()true です。
Qtrim()で全角スペースが消えないのはなぜですか?
Atrim()コード値が U+0020 以下の文字しか除去しないためです。全角スペース( )は U+3000 で U+0020 より大きいので対象外です。全角スペースも除去したい場合は strip() を使ってください。
Qtrim()とstrip()はどちらを使うべきですか?
AJava 11以降なら strip() を推奨します。Unicodeの空白判定に基づくため全角スペースなどにも対応し、想定外の取りこぼしが減ります。古い環境との互換性が必要な場合のみ trim() を使います。
Q「空白のみか」を一番簡単に判定する方法は?
AJava 11以降の isBlank() です。str.isBlank() は、空文字でも全角スペースのみでも true を返します。null の可能性があるときは s == null || s.isBlank() と組み合わせます。

まとめ

Javaのtrim()と空白判定のポイントを整理します。

  • 空白のみの文字列に trim() を適用すると空文字(null ではない)が返る
  • trim() が消すのはU+0020 以下の文字だけ=全角スペースは残る
  • 全角スペースも除去するなら Java 11以降の strip()
  • 「空白のみか」の判定は isBlank() が最適
  • null に対する呼び出しは例外になるので、先に null チェックする

関連として、先頭と末尾のスペースを削除する方法文字列から改行を除去・置換する方法isEmptyメソッドの使い方もあわせて読むと、文字列の空白処理に強くなれます。