AIによる要約
isEmptyは文字数が0かを判定し、空白だけの文字列はfalseです。isBlankは空文字または空白文字だけならtrueになります。どちらも呼び出し元がnullならNullPointerExceptionです。画面入力では未送信、空文字、空白だけ、値ありを区別し、必須項目ならisBlank、空文字だけを特別扱いするならisEmptyなど、業務仕様に合わせます。trimとstripは文字列を変換するメソッドで、判定とは役割が異なります。


入力チェックでは『値がない』という言葉をよく使いますが、Java上ではnull、空文字、半角スペース、全角スペース、タブ、改行が別の状態です。これらを同じとみなすかは項目ごとに異なります。
必須チェックへisEmptyだけを使うと、スペースだけの氏名や備考が通過します。一方、パスワードや固定長コードでは空白も有効文字かもしれません。APIの違いを理解し、入力仕様を先に決めます。
この記事のポイント
- isEmptyはlengthが0かを判定する
- isBlankは空文字または空白文字だけならtrue
- nullへ呼ぶとどちらもNullPointerException
- trimとstripは変換であり判定ではない
- 空白を未入力扱いするかは項目仕様で決める
isEmptyは文字数0だけを判定する
isEmpty()はlength() == 0と同じ意味です。半角スペースが1文字あれば空ではないためfalseになります。
System.out.println("".isEmpty()); // true
System.out.println(" ".isEmpty()); // false
System.out.println(" ".isEmpty()); // false
System.out.println("A".isEmpty()); // false空白を有効な値として残す処理や、区切り後に空文字だけを検出する処理ではisEmptyが意図に合う場合があります。必須入力へ機械的に使うとは限りません。
isBlankは空白だけもtrue
Java 11以降のisBlank()は、空文字またはすべての文字が空白文字ならtrueです。半角スペース、タブ、改行などを空白として扱います。
System.out.println("".isBlank()); // true
System.out.println(" ".isBlank()); // true
System.out.println("\t".isBlank()); // true
System.out.println("A ".isBlank()); // false空白の定義は単純な半角スペースだけではありません。古いJavaや独自ユーティリティを使う案件では、どのUnicode文字を空白として扱うか既存仕様を確認します。
nullにはどちらも使えない
nullはStringオブジェクトが存在しない状態なので、インスタンスメソッドを呼べません。nullの可能性がある入力では先に判定します。
static boolean isMissing(String value) {
return value == null || value.isBlank();
}同じ判定が何度も出るなら、Bean Validationの@NotBlank、案件標準のStringユーティリティ、Formの正規化など、境界で統一します。ただし独自メソッド名は『何を未入力とするか』が分かる名前にします。
trim・stripとの違い
trimとstripは前後の空白を除いた新しい文字列を返す変換処理です。isBlankは値を変えず判定します。LocalDateと同様、Stringも不変なので戻り値を使う必要があります。
String input = " ABC ";
input.strip();
System.out.println(input); // 空白は残る
String normalized = input.strip();
System.out.println(normalized); // ABC入力を勝手にtrimすると、パスワードや固定桁コード、備考の意図した空白を壊す可能性があります。正規化する項目と、入力をそのまま保持する項目を分けます。
Formの必須チェックでは@NotBlankを検討する
Spring MVCのFormでは、Controller内でifを重ねるよりBean Validationで宣言できます。@NotNull、@NotEmpty、@NotBlankは許可する状態が異なります。
class UserForm {
@NotBlank(message = "氏名を入力してください")
private String name;
@NotEmpty(message = "権限を1つ以上選択してください")
private List<String> roles;
}文字列の必須入力にはNotBlankがよく合いますが、すべての項目へ同じアノテーションを付けません。数値、List、チェックボックス、任意項目の仕様に合う制約を選びます。
CSV・外部連携で空白を勝手に消さない
外部ファイルの空白が埋め文字なのか有効値なのかは連携仕様次第です。固定長ファイルでは右側空白を除去する一方、項目内の空白を維持することがあります。
String rawCode = row.code();
if (rawCode == null || rawCode.isBlank()) {
errors.add("商品コードが未入力です");
} else {
String code = rawCode.strip();
validateCode(code);
}検証用の値と保存する原文を分ける場合もあります。どの段階で正規化したかをログやエラー表示で追えるようにします。
状態表とテストで仕様を固定する
入力項目ごとに、null、空文字、半角空白、全角空白、タブ、値ありを表にして期待結果を決めると、レビューで認識を合わせやすくなります。
@ParameterizedTest
@NullAndEmptySource
@ValueSource(strings = {" ", " ", "\t", "\n"})
void 氏名の空入力を拒否する(String value) {
assertTrue(value == null || value.isBlank());
}バリデーションをテストするなら、単なるString判定だけでなくValidatorやMockMvcを通し、実際のエラーメッセージと再表示まで確認します。
現場レビューでよくある指摘
空入力のレビューではメソッド名だけでなく、対象項目で空白を有効とするか、正規化前後のどちらを保存するかを確認します。
// レビューコメント例
isEmptyではスペースだけの氏名が通ります。
必須項目の仕様に合わせてisBlankまたは@NotBlankを使ってください。
// レビューコメント例
valueがnullのときisBlankでNullPointerExceptionになります。
Controllerへ届く値の契約を確認し、境界で統一してください。
// レビューコメント例
全項目をtrimするとパスワードや固定長値まで変わります。
正規化対象の項目だけに限定してください。『空ならエラー』という曖昧な仕様を、具体的な入力例へ置き換えます。画面、API、CSVで同じ項目の扱いが違う場合は、境界ごとのルールを明示します。
提出前のセルフチェック
レビュー前に確認すること
- null・空文字・空白を区別したか
- isEmptyとisBlankのどちらが仕様に合うか
- nullへメソッドを呼んでいないか
- 全角空白・タブ・改行を試したか
- trimやstripの戻り値を使っているか
- 空白を勝手に除去してよい項目か
- Bean Validationで表現できないか
- 画面とAPIとCSVで同じ契約か
文字列と入力検証を整理する参考書
String APIの基本とWeb入力の流れを合わせて学ぶと、null・空文字・空白の違いを場当たり的なif文で処理せずに済みます。
スッキリわかるJava入門 第5版
Java文法とオブジェクト指向を、最初から整理する一冊。
豊富な図とサンプルで、変数、条件分岐、クラス、例外処理まで順番に学べます。Javaの最初の教科書を探している人向けです。
- Javaを基礎から体系的に学びたい
- Java 25 LTS対応の入門書を選びたい
当サイトはAmazonアソシエイト・プログラムの参加者です。価格・在庫・配送条件はAmazonでご確認ください。
この記事とあわせて読みたい
まとめ
isEmptyは文字数0だけ、isBlankは空文字と空白文字だけの値をtrueと判定します。どちらもnullへ呼ぶとNullPointerExceptionです。
必須項目ならisBlankや@NotBlankが適することが多い一方、空白を有効とする項目もあります。null、空文字、各種空白の期待結果を具体化し、正規化する項目だけを限定してください。
