本ページはプロモーションが含まれています

Java入門

【Java】空白判定の3つの方法と注意点を分かりやすく解説

トム

・都内自社開発IT企業勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィールはこちら

「Javaで入力チェックしたいんだけど、空白ってどう判定するのが正解なんだろ?」

「isEmpty() と isBlank() の違いがよく分からない…」

「全角スペースでハマってバグった……」

こんな経験、Javaやってる人なら一度はあるはずです。

自分も駆け出しの頃は、入力バリデーションで全角スペースに気づかず数時間デバッグしたことがあります。画面には見えないのに、システムはしっかり認識してるから余計に混乱しちゃうんですよね。

空白判定って一見シンプルだけど、実は奥が深い領域。どの方法を選ぶかで、コードの読みやすさも保守性も変わってきます。この記事では、Javaの空白判定の基本から、一歩踏み込んだテクニック、そしてよくある落とし穴まで、まとめて分かりやすく解説します。

こんな人に向けた内容です。

ポイント

  • Javaでの空白チェックをきちんと理解したい
  • isEmpty() と isBlank() の違いを整理したい
  • 全角スペースも含めて堅牢な判定をしたい

空白(ホワイトスペース)とは?

まず「そもそも空白とは?」という話から整理しておきます。空白というとスペースのイメージですが、プログラム的にはもっといろいろ含まれます。

Javaにおける空白文字の定義

Javaでは、Character.isWhitespace(char ch) を使うと、その文字が“空白扱い”かどうかをチェックできる。ここで true が返ってくる文字が、Java的にいう「空白文字(ホワイトスペース)」ってやつです。

空白っていうと普通のスペースを思い浮かべるけど、実はもっと範囲が広いです。タブ、改行、そして普段のエディタじゃ見えないレアな区切り文字まで含まれる。Unicodeで決められた色んな“見えない文字”がセットになってるイメージです。

よく使われる空白文字の種類(スペース・タブ・改行)

日常的なプログラミングで遭遇する代表的な空白文字は、主に以下の3つです。

種類表現説明
スペースいわゆる半角スペース。単語の区切りなどに使われる。
タブ\t水平タブ文字。コードのインデントやテキストの位置揃えに利用される。
改行\n, \rテキストを新しい行に移動させるための文字。OSによって扱いが異なる。

これらの文字は、画面上では何も表示されないか、あるいは単なる隙間にしか見えません。しかし、文字列データとしては確実に存在しており、空白判定を正しく行わないと、予期せぬバグの原因になります。

空白判定の基本的な方法

「これって空っぽ?」「ただの空白?」みたいな判定をしたい時って、いくつか王道パターンがあります。ここでは、よく使われるisEmpty()isBlank()の違い、それから昔ながらのtrim()を使ったやり方をサクッと紹介します。

isEmpty() と isBlank() の違い

isEmpty()isBlank() はどちらも文字列チェックに使うメソッドだけど、見ているポイントがちょっと違います。この違いを知っておくと、入力チェックで変なミスを避けられるようになります。

結論から言うと、文字列が「空っぽ」かどうかだけを知りたいならisEmpty()を、「意味のある文字が一つもない」状態かを判定したいならisBlank()を使います。

isEmpty()

  • 文字列の長さが0かどうかを判定
  • " ".isEmpty()false を返す。なぜなら、半角スペース1つ分の長さ(1)があるから
  • "".isEmpty()true を返す

isBlank()

  • 文字列が空であるか、または空白文字のみで構成されているかを判定
  • " ".isBlank()true を返す。半角スペースしか含まれていないため
  • "".isBlank()true を返す

ユーザーがフォームで「スペースだけ入れて登録」みたいな、よくある“抜け道”を潰したい場合は isBlank() を使うのが正解isEmpty() だとスペースが1個でも入っていれば false になってしまい、意図しない入力を通してしまいます。

trim() を使った空白削除と判定

Java 11より前のバージョンを使っている環境では、String.isBlank()メソッドは利用できません。その場合の代替策としてよく使われるのが、trim()メソッドとisEmpty()を組み合わせる方法です。

trim()メソッドは、文字列の前後にくっついてる「半角の空白(スペース・タブ・改行)」をごっそり削ってくれるメソッドです。

String s1 = "  hello world  ";
String s2 = s1.trim(); // "hello world" になります

String s3 = "   ";
String s4 = s3.trim(); // "" (空文字列) になります

この特性を利用して、trim()で前後の空白を消し去った後、isEmpty()で長さが0になったかどうかをチェックすれば、isBlank()と似たような判定が実現できます。

str.trim().isEmpty()

この方法は非常に便利ですが、一つ注意点があります。trim()が除去できるのは半角の空白文字のみです。全角スペースは除去できないため、" ".trim().isEmpty()falseになってしまいます。

文字列が完全に空白かどうかを判定するサンプルコード

それでは、実際にコードで動作の違いを見てみましょう。

public class WhitespaceCheck {
    public static void main(String[] args) {
        String str1 = ""; // 空文字列
        String str2 = " "; // 半角スペース
        String str3 = " "; // 全角スペース
        String str4 = "\t \n"; // タブ、スペース、改行
        String str5 = "  Java  ";

        System.out.println("--- isEmpty() の結果 ---");
        System.out.println("str1(\"\"): " + str1.isEmpty()); // true
        System.out.println("str2(\" \"): " + str2.isEmpty()); // false
        System.out.println("str3(\" \"): " + str3.isEmpty()); // false
        System.out.println("str4(\"\\t \\n\"): " + str4.isEmpty()); // false
        System.out.println("str5(\"  Java  \"): " + str5.isEmpty()); // false

        System.out.println("\n--- isBlank() の結果 (Java 11以降) ---");
        System.out.println("str1(\"\"): " + str1.isBlank()); // true
        System.out.println("str2(\" \"): " + str2.isBlank()); // true
        System.out.println("str3(\" \"): " + str3.isBlank()); // true (全角スペースも判定)
        System.out.println("str4(\"\\t \\n\"): " + str4.isBlank()); // true
        System.out.println("str5(\"  Java  \"): " + str5.isBlank()); // false

        System.out.println("\n--- trim().isEmpty() の結果 ---");
        System.out.println("str1(\"\"): " + str1.trim().isEmpty()); // true
        System.out.println("str2(\" \"): " + str2.trim().isEmpty()); // true
        System.out.println("str3(\" \"): " + str3.trim().isEmpty()); // false (全角スペースは残る)
        System.out.println("str4(\"\\t \\n\"): " + str4.trim().isEmpty()); // true
        System.out.println("str5(\"  Java  \"): " + str5.trim().isEmpty()); // false
    }
}

この結果から、isBlank()が最も直感的で強力な判定を行えることが分かります。特に全角スペースまで正しく判定してくれる点は、日本語を扱うシステムでは非常に重要です。

空白判定でよく使われるメソッド一覧

基本的な方法に加えて、より堅牢で便利な空白判定を実現するための代表的なメソッドを3つ紹介します。プロジェクトの環境や要件に応じて最適なものを選択してください。

StringUtils.isBlank()(Apache Commons Lang)

Java 11が出てくる前までは、空白チェックといえば StringUtils.isBlank() が空白判定のデファクトスタンダード(事実上の標準)でした。外部ライブラリであるApache Commons Langに含まれています。

このメソッドのメリットは、とにかく null を渡しても落ちないこと。Javaの標準 isBlank() は null だと容赦なく例外を投げてくるけど、StringUtils.isBlank() はちゃんと true を返してくれるので安心です。

String str = null;

// 標準のisBlank()は例外が発生する
str.isBlank(); // -> NullPointerException

// StringUtils.isBlank()は安全
boolean result = org.apache.commons.lang3.StringUtils.isBlank(str); // trueが返る

null チェックをわざわざif (str != null && str.isBlank())みたいに書かなくて済むので、コードがスッキリするんですよね。

あわせて読む

String.isBlank()(Java 11以降)

Java 11 から追加された、標準で使える便利メソッド。外部ライブラリを入れなくてもサッと使えるのがうれしいポイントです。

ただし、StringUtils.isBlank() と違って null には優しくない(null-safeじゃない) ので、値が null になる可能性があるときは先にチェックしておく必要があります」。

もし新しく始めるプロジェクトで Java 11 以降が使えるなら、まずはこの String.isBlank() を使うのが手っ取り早くておすすめ。

Patternを使った正規表現での判定方法

もうちょっと柔軟に「空白だけかどうか」を判定したい時は、正規表現が便利。Javaで正規表現を使うなら、Pattern クラスや String.matches() を使うのが定番です。

空白だけの文字列を判定したい場合に使える有名どころのパターンが \s*です。

  • \s: スペース、タブ、改行などのあらゆる空白文字にマッチ
  • *: 直前の文字が0回以上繰り返されるという意味

つまり、\s*は「空白文字が0個以上続く文字列」にマッチします。(空白だけ、または完全に空文字でもOK)

import java.util.regex.Pattern;

public class RegexCheck {
    public static void main(String[] args) {
        String str1 = " ";
        String str2 = " "; // 全角スペース
        String str3 = "  \t  ";
        String str4 = "not blank";

        // パターンを定義
        Pattern pattern = Pattern.compile("\\s*");

        System.out.println("str1: " + pattern.matcher(str1).matches()); // true
        System.out.println("str2: " + pattern.matcher(str2).matches()); // true
        System.out.println("str3: " + pattern.matcher(str3).matches()); // true
        System.out.println("str4: " + pattern.matcher(str4).matches()); // false
    }
}

正規表現を使うと、全角スペースも含めて“空白なら全部OK”という判定ができます。

ただ、isBlank() みたいな専用メソッドに比べるとちょっと遅いし、正規表現は慣れるまで覚えることが多い。単純な空白チェックだけなら isBlank() を使った方が気楽で扱いやすいです。

ユースケース別の空白判定実装例

実際のコードでどのように空白判定が使われるのかを見ていきましょう。代表的な3つのユースケースを紹介します。

入力フォームのバリデーションで使う

Webアプリケーションで最も一般的な使われ方です。ユーザーIDやパスワード、氏名などの入力が空や空白文字だけでないことを確認します。

// Java 11以降の場合
public boolean isUserIdValid(String userId) {
    // ユーザーIDがnullでもなく、空白だけでもないことを確認
    if (userId == null || userId.isBlank()) {
        System.out.println("エラー: ユーザーIDが入力されていません。");
        return false;
    }
    // ここに文字数や形式のチェック処理などを追加
    return true;
}

// Apache Commons Lang を使う場合
public boolean isPasswordValid(String password) {
    // StringUtils.isBlankはnull-safeなので、nullチェックが不要
    if (org.apache.commons.lang3.StringUtils.isBlank(password)) {
        System.out.println("エラー: パスワードが入力されていません。");
        return false;
    }
    return true;
}

ログ出力・ファイル処理での空白チェック

CSVファイルや設定ファイルなどを読み込む際に、空行や不要な空白行を読み飛ばしたい場合があります。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.io.IOException;

public class FileReaderExample {
    public void processFile(String filePath) {
        try {
            List<String> lines = Files.readAllLines(Paths.get(filePath));
            for (String line : lines) {
                // 行が空白でない場合のみ処理を実行する
                if (!line.isBlank()) {
                    System.out.println("処理対象行: " + line);
                    // ここでCSVのパースなどの実処理を行う
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

isBlank()を使うことで、空行だけでなく、スペースやタブだけの行もきれいに無視できます。

nullチェックとの組み合わせパターン

前述しましたが、nullチェックとの組み合わせは非常に重要です。改めてパターンを整理します。

パターン1: 標準API (Java 11以降)

nullチェックとisBlank()を|| (OR) でつなぐのが定石です。

String input = ...; // どこかから来る入力値
if (input == null || input.isBlank()) {
    // エラー処理やデフォルト値の設定
}

パターン2: Apache Commons Lang

StringUtils.isBlank()だけでnullと空白の両方をチェックできます。コードがすっきりします。

String input = ...; // どこかから来る入力値
if (org.apache.commons.lang3.StringUtils.isBlank(input)) {
    // エラー処理やデフォルト値の設定
}

どちらのパターンも結果は同じですが、コードの可読性やプロジェクトの依存関係を考慮して選択してください。

まとめ(目的に応じた空白判定の選び方)

Javaでの空白判定は、目的に応じて適切なメソッドを選択することが、バグが少なく保守性の高いコードを書くための鍵です。

今回の内容をまとめると、以下のようになります。

簡易的な判定にはisBlank()

Java 11以降の環境であれば、String.isBlank()が最も手軽で強力な選択肢です。理由は、標準APIであるため外部ライブラリが不要なうえ、全角スペースを含む多様な空白文字を正しく判定できるからです。ユーザー入力のチェックなど、多くのケースでこのメソッドが役立ちます。

より厳密な処理には正規表現や外部ライブラリ

Java 8など古いバージョンを使っている場合や、nullを安全に扱いたい場合には、Apache Commons LangのStringUtils.isBlank()が非常に有効です。nullチェックを簡潔に書けるため、コードの可読性が向上します。

また、「文字列の途中にある空白は許すが、先頭と末尾の空白だけをチェックしたい」といった複雑なルールが必要な場合は、正規表現の利用を検討しましょう。

保守性を考えた実装ポイント

最も重要なのはプロジェクト内で判定方法を統一することです。

チーム内で「空白判定には原則としてString.isBlank()を使う」といったコーディング規約を設けることをお勧めします。コードのばらつきを防ぎ、誰が見ても挙動を理解しやすい、メンテナンス性に優れたアプリケーションを維持できます。

  • この記事を書いた人
  • 最新記事

トム

・都内自社開発IT企業勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィールはこちら

-Java入門