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 == null は false、trimmed.isEmpty() は true です。Qtrim()で全角スペースが消えないのはなぜですか?
A
trim() はコード値が 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メソッドの使い方もあわせて読むと、文字列の空白処理に強くなれます。
