空文字判定は「入力の本当の中身を見る」作業
業務システムでは、ユーザー入力や外部システムから受け取る文字列が「本当に何か入っているか」を判定する場面が大量に出てきます。
ここでちゃんと判定できないと、必須チェックをすり抜けたり、検索条件が効かなかったり、思わぬバグの温床になります。
そのときのキーワードが「空文字判定」です。
ただし、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
JavaisEmpty() は「長さ 0 かどうか」だけを見るので、" " や " " は false になります。
一方 isBlank() は、Character.isWhitespace() に基づいて空白文字を判定するため、半角スペース・タブ・改行・全角スペースなどをすべて「空白」とみなします。
業務の入力チェックでは、「スペースだけの入力は未入力とみなしたい」ことがほとんどなので、Java 11 以上なら isBlank() を使うのが実務的にかなり有利です。
trim / strip と組み合わせるパターンとの違い
Java 11 未満では、次のように書くことが多いです。
String s = getInput(); // null ではない前提
boolean isBlank = s.trim().isEmpty();
Javatrim() で前後の空白を削ってから isEmpty() で判定することで、「空白だけの文字列」を空とみなせます。
ただし、trim() は古い空白定義に基づいていて、全角スペースなどを削除できないことがあるため、Unicode 空白まできちんと扱いたい場合は strip() と組み合わせるほうが安全です。
boolean isBlank = s.strip().isEmpty(); // Java 11 以降
JavaisBlank() はこの「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
JavaStringUtils の大きなメリットは「null セーフ」であることです。null を渡しても例外にならず、意図した論理値を返してくれるので、入力チェックやバリデーションコードがかなりシンプルになります。
実務で意識したい空文字判定の設計ポイント
何を「空」とみなすかをチームで決める
空文字判定は、「どこまでを空とみなすか」で挙動が変わります。
- null だけを空とみなすのか
- 長さ 0 も空とみなすのか
- スペースだけの文字列も空とみなすのか
- 全角スペースやタブ、改行も含めるのか
ここを曖昧にしたまま各自が好きな書き方をすると、「画面 A では通るのに画面 B ではエラーになる」といった不統一が起きます。
プロジェクトのどこかに「文字列の正規化・空判定ポリシー」を決めて、そのポリシーを実装したユーティリティを用意しておくのが、業務システムではとても重要です。
「判定」と「正規化」をセットで考える
空文字判定だけでなく、「前後の空白を削る」「全角スペースを半角にそろえる」といった正規化処理とセットで考えると、入力チェックがより堅牢になります。
例えば次のような流れです。
- 受け取った文字列を
strip()などでトリムする - 必要なら全角スペースを半角に変換する
- その結果に対して
isEmpty()やisBlank()で判定する
この「正規化 → 判定」の流れをユーティリティに閉じ込めておくと、
業務ロジック側は「このメソッドを呼べば、ちゃんとした空判定をしてくれる」と信頼して書けるようになります。
まとめ:初心者がまず身につけるステップ
ステップ 1:null・空文字・空白だけの違いを理解する
null は「何も入っていない」、"" は「長さ 0 の文字列」、" " や " " は「空白文字が入っている文字列」です。
この 3 つを頭の中でちゃんと区別できるようになると、空文字判定の迷いが減ります。
ステップ 2:isEmpty / isBlank の使い分けを覚える
Java 11 未満なら isEmpty() と trim() の組み合わせ、
Java 11 以上なら isBlank() を基本にする、という方針を持っておくと実務で迷いません。
ステップ 3:null も含めたユーティリティを自分で書いてみる
isNullOrEmpty や isNullOrBlank のようなメソッドを自分で実装してみると、
「何を空とみなすか」を自分の言葉で定義できるようになります。
その感覚が身につけば、もう空文字判定で振り回されることはなくなります。
