Java Tips | 基本ユーティリティ:空文字判定

Java Java
スポンサーリンク

空文字判定は「入力の本当の中身を見る」作業

業務システムでは、ユーザー入力や外部システムから受け取る文字列が「本当に何か入っているか」を判定する場面が大量に出てきます。
ここでちゃんと判定できないと、必須チェックをすり抜けたり、検索条件が効かなかったり、思わぬバグの温床になります。

そのときのキーワードが「空文字判定」です。
ただし、Java では「null」「空文字」「空白だけの文字列」が全部違うものとして扱われるので、まずはこの違いを整理するところから始めましょう。


null・空文字・空白だけの違いを整理する

それぞれの意味をイメージでつかむ

  • null: 「変数に何も入っていない」状態。箱そのものが存在しないイメージ。
  • 空文字 "": 「箱はあるけど、中身が空」の状態。長さ 0 の文字列。
  • 空白だけ " "" ": 文字は入っているが、それがスペースやタブ、改行などの「空白文字」だけの状態。

Java では、null と空文字は全く別物です。
null に対してメソッドを呼ぶと NullPointerException になりますが、空文字は長さ 0 の普通の文字列なので、メソッド呼び出しは可能です。


String.isEmpty と length() == 0 の基本

isEmpty の意味と使い方

String.isEmpty() は「長さが 0 かどうか」を判定するメソッドです。

String s1 = "";
String s2 = "a";

System.out.println(s1.isEmpty()); // true
System.out.println(s2.isEmpty()); // false
Java

これは内部的には「length() == 0 かどうか」を見ているだけなので、
isEmpty()s.length() == 0 は同じ意味です。

if (s.isEmpty()) {
    // 何も文字が入っていない
}
Java

ここで重要なのは、「isEmpty() は null には使えない」という点です。
String s = null; の状態で s.isEmpty() を呼ぶと NullPointerException になります。

equals(“”) との違いと好みの問題

空文字判定は、次のようにも書けます。

if ("".equals(s)) {
    // 空文字
}
Java

この書き方のメリットは、「左側がリテラルなので null でも安全」という点です。

String s = null;

if ("".equals(s)) {  // false だが、例外にはならない
    ...
}
Java

ただし、「空文字かつ null ではない」という前提があるなら、isEmpty() のほうが意図が伝わりやすく、読みやすいことが多いです。


Java 11 以降の isBlank で「空白だけ」も判定する

isEmpty と isBlank の違いを深掘り

Java 11 から String.isBlank() が追加されました。
これは「長さが 0 か、空白文字だけで構成されているか」を判定します。

String s1 = "";
String s2 = "   ";   // 半角スペースだけ
String s3 = " ";    // 全角スペースだけ
String s4 = "a";

System.out.println(s1.isBlank()); // true
System.out.println(s2.isBlank()); // true
System.out.println(s3.isBlank()); // true
System.out.println(s4.isBlank()); // false
Java

isEmpty() は「長さ 0 かどうか」だけを見るので、" "" " は false になります。
一方 isBlank() は、Character.isWhitespace() に基づいて空白文字を判定するため、半角スペース・タブ・改行・全角スペースなどをすべて「空白」とみなします。

業務の入力チェックでは、「スペースだけの入力は未入力とみなしたい」ことがほとんどなので、Java 11 以上なら isBlank() を使うのが実務的にかなり有利です。

trim / strip と組み合わせるパターンとの違い

Java 11 未満では、次のように書くことが多いです。

String s = getInput();  // null ではない前提

boolean isBlank = s.trim().isEmpty();
Java

trim() で前後の空白を削ってから isEmpty() で判定することで、「空白だけの文字列」を空とみなせます。
ただし、trim() は古い空白定義に基づいていて、全角スペースなどを削除できないことがあるため、Unicode 空白まできちんと扱いたい場合は strip() と組み合わせるほうが安全です。

boolean isBlank = s.strip().isEmpty();  // Java 11 以降
Java

isBlank() はこの「strip + isEmpty」の組み合わせを、より分かりやすく 1 メソッドにしたものだとイメージすると理解しやすいです。


null も含めた「実務的な空文字判定」の書き方

null と空文字をまとめて扱うユーティリティ

業務コードでは、「null または空文字(あるいは空白だけ)なら未入力とみなす」という判定が頻出します。
毎回 s != null && !s.isEmpty() と書くのは面倒なので、ユーティリティメソッドにまとめてしまうのが定番です。

public final class Strings {

    private Strings() {}

    // null または長さ 0 を「空」とみなす
    public static boolean isNullOrEmpty(String s) {
        return s == null || s.isEmpty();
    }

    // null または空白だけを「空」とみなす(Java 11 以上)
    public static boolean isNullOrBlank(String s) {
        return s == null || s.isBlank();
    }
}
Java

使う側はこうなります。

String name = getInputName();  // null かもしれない

if (Strings.isNullOrBlank(name)) {
    System.out.println("名前は必須です");
}
Java

このように「何を空とみなすか」をメソッド名で表現しておくと、
業務ロジック側のコードがかなり読みやすくなり、バグも入り込みにくくなります。

Apache Commons StringUtils を使う選択肢

外部ライブラリを使えるプロジェクトなら、Apache Commons Lang の StringUtils を使うのも実務ではよくあるパターンです。

StringUtils.isEmpty は「null または長さ 0 の文字列なら true」、
StringUtils.isBlank は「null または空白だけの文字列なら true」を返します。

import org.apache.commons.lang3.StringUtils;

String s1 = null;
String s2 = "";
String s3 = "   ";

System.out.println(StringUtils.isEmpty(s1)); // true
System.out.println(StringUtils.isEmpty(s2)); // true
System.out.println(StringUtils.isEmpty(s3)); // false

System.out.println(StringUtils.isBlank(s1)); // true
System.out.println(StringUtils.isBlank(s2)); // true
System.out.println(StringUtils.isBlank(s3)); // true
Java

StringUtils の大きなメリットは「null セーフ」であることです。
null を渡しても例外にならず、意図した論理値を返してくれるので、入力チェックやバリデーションコードがかなりシンプルになります。


実務で意識したい空文字判定の設計ポイント

何を「空」とみなすかをチームで決める

空文字判定は、「どこまでを空とみなすか」で挙動が変わります。

  • null だけを空とみなすのか
  • 長さ 0 も空とみなすのか
  • スペースだけの文字列も空とみなすのか
  • 全角スペースやタブ、改行も含めるのか

ここを曖昧にしたまま各自が好きな書き方をすると、「画面 A では通るのに画面 B ではエラーになる」といった不統一が起きます。
プロジェクトのどこかに「文字列の正規化・空判定ポリシー」を決めて、そのポリシーを実装したユーティリティを用意しておくのが、業務システムではとても重要です。

「判定」と「正規化」をセットで考える

空文字判定だけでなく、「前後の空白を削る」「全角スペースを半角にそろえる」といった正規化処理とセットで考えると、入力チェックがより堅牢になります。

例えば次のような流れです。

  1. 受け取った文字列を strip() などでトリムする
  2. 必要なら全角スペースを半角に変換する
  3. その結果に対して isEmpty()isBlank() で判定する

この「正規化 → 判定」の流れをユーティリティに閉じ込めておくと、
業務ロジック側は「このメソッドを呼べば、ちゃんとした空判定をしてくれる」と信頼して書けるようになります。


まとめ:初心者がまず身につけるステップ

ステップ 1:null・空文字・空白だけの違いを理解する

null は「何も入っていない」、"" は「長さ 0 の文字列」、" "" " は「空白文字が入っている文字列」です。
この 3 つを頭の中でちゃんと区別できるようになると、空文字判定の迷いが減ります。

ステップ 2:isEmpty / isBlank の使い分けを覚える

Java 11 未満なら isEmpty()trim() の組み合わせ、
Java 11 以上なら isBlank() を基本にする、という方針を持っておくと実務で迷いません。

ステップ 3:null も含めたユーティリティを自分で書いてみる

isNullOrEmptyisNullOrBlank のようなメソッドを自分で実装してみると、
「何を空とみなすか」を自分の言葉で定義できるようになります。
その感覚が身につけば、もう空文字判定で振り回されることはなくなります。

タイトルとURLをコピーしました