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

Java入門

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

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

「Javaでユーザーからの入力値をチェックしたいけど、空白の判定ってどうやるのがベストなの?」

「isEmpty()とisBlank()って、何が違うのかいまいち分からない…」

「全角スペースが原因でバグが起きてしまった…」

私もキャリアの浅い頃、ユーザー入力のバリデーションで空白文字の扱いに頭を悩ませた経験があります。特に、目に見えない全角スペースが原因でシステムがうまく動かず、デバッグに数時間費やしたことも一度や二度ではありません。

Javaでの空白判定は、単純そうに見えて実は奥が深く、どの方法を選ぶかでコードの品質や保守性が大きく変わってきます。

この記事を読めば、Javaの空白判定で迷うことはなくなります。基本的な判定方法から、ライブラリを使った実践的なテクニック、そして思わぬ落とし穴まで、あなたの疑問をすべて解決します。

この記事は、以下のような悩みを持つJava初学者から中級者の方に向けて書いています。

ポイント

  • Javaでの基本的な空白判定方法を知りたい方
  • isEmpty()isBlank()の違いを正しく理解したい方
  • 全角スペースなど、特殊な空白に対応できる堅牢なコードを書きたい方

それでは、Javaにおける空白判定の世界を一緒に見ていきましょう。

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

まず、「空白」とは何かを正しく理解することが、適切な空白判定を行うための第一歩です。プログラムの世界では、単にスペースキーで入力される文字だけが空白ではありません。

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

Javaでは、Character.isWhitespace(char ch)メソッドで文字が空白かどうかを判定できます。このメソッドがtrueを返す文字が、Javaにおける「空白文字(ホワイトスペース)」です。

具体的には、Unicode標準で定義されているさまざまな空白文字が対象となります。一般的なスペースだけでなく、タブや改行コード、さらには通常のエディタでは見えない特殊な区切り文字なども含まれます。

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

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

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

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

空白判定の基本的な方法

Javaで空白を判定するには、いくつかの基本的な方法があります。ここでは、特によく使われるisEmpty()isBlank()の違い、そしてtrim()を使った古典的な手法を解説します。

isEmpty() と isBlank() の違い

isEmpty()isBlank()は、JavaのStringクラスに用意されているメソッドですが、その役割は明確に異なります。この違いを理解することが、javaの空白判定をマスターする鍵です。

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

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

ユーザー入力のバリデーションでは、「スペースだけ入力して登録ボタンを押す」といった操作を許したくありません。このようなケースでは、isBlank()を使うのが適切です。

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

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

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

StringUtils.isBlank()(Apache Commons Lang)

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

このメソッドの最大の利点は、nullを渡してもNullPointerExceptionが発生しない(null-safeである)点です。

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())のようなnullチェックが不要になり、コードをシンプルに書けます。Java 8など、古いバージョンを使っているプロジェクトでは今なお現役で活躍している、非常に信頼性の高いメソッドです。

String.isBlank()(Java 11以降)

前述の通り、Java 11から標準APIとして導入されたメソッドです。外部ライブラリを追加する必要がなく、手軽に利用できるのが最大のメリットです。

StringUtils.isBlank()とは異なりnull-safeではないため、nullの可能性がある変数に使う場合は、事前にnullチェックが必要です。

新しいプロジェクトでJava 11以降のバージョンを使えるのであれば、このString.isBlank()を第一候補に考えるのが良いでしょう。

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

より複雑で柔軟な判定がしたい場合には、正規表現が強力な武器になります。Javaで正規表現を扱うには、PatternクラスやString.matches()メソッドを使います。

空白文字のみで構成されている文字列を判定する正規表現パターンは \s* です。

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

つまり、\s*は「空白文字が0個以上続く文字列」にマッチします。

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
    }
}

正規表現を使えば、全角スペースを含むあらゆる空白文字を判定できます。

ただし、isBlank()などの専用メソッドに比べて処理速度がわずかに遅くなる傾向があり、また正規表現自体の学習コストがかかるため、単純な空白判定のためだけならisBlank()などを使う方が手軽です。

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

理論だけでなく、実際のコードでどのようにjavaの空白判定が使われるのかを見ていきましょう。代表的な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()を使う」といったコーディング規約を設けることをお勧めします。これにより、コードのばらつきを防ぎ、誰が見ても挙動を理解しやすい、メンテナンス性に優れたアプリケーションを維持できるでしょう。

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

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

-Java入門