| この記事の要点 |
|
基本の判定
String s = getValue();
// null または長さ 0
if (s == null || s.isEmpty()) { }
// null または空白だけ(Java 11 以降)
if (s == null || s.isBlank()) { }
// Java 10 以前
if (s == null || s.trim().isEmpty()) { }
// null チェックを先に書く(&& は短絡評価なので安全)
// if (s.isEmpty() || s == null) ← 逆にすると NullPointerException
|| は左が真なら右を評価しません。s == null を必ず先に書いてください。
isEmpty と isBlank の違い
| 値 | isEmpty() | isBlank() | trim().isEmpty() |
|---|---|---|---|
"" | true | true | true |
" "(半角空白) | false | true | true |
" "(全角空白) | false | true | false |
"\t\n" | false | true | true |
"abc" | false | false | false |
null | NullPointerException | ||
String zenkaku = " "; // 全角スペース
System.out.println(zenkaku.isEmpty()); // false
System.out.println(zenkaku.isBlank()); // true Unicode の空白を判定する
System.out.println(zenkaku.trim().isEmpty()); // false trim は U+0020 以下しか削らない
System.out.println(zenkaku.strip().isEmpty()); // true strip は Unicode 対応
日本語の入力フォームでは全角スペースが必ず混ざります。trim() ではなく isBlank() か strip() を使ってください。
null 安全に書く
String s = null;
// 落ちる
// if (s.equals("")) { }
// 定数を左に置く
if ("".equals(s)) { } // false(例外にならない)
// Objects を使う
if (Objects.equals(s, "")) { } // false
// 既定値を用意する
String value = Objects.requireNonNullElse(s, "");
String value2 = Objects.toString(s, ""); // null なら ""
String value3 = Objects.requireNonNullElseGet(s, () -> loadDefault());
// 必須の引数は早い段階で落とす
public void run(String name) {
Objects.requireNonNull(name, "name は必須です");
}
判定用のメソッドを 1 つ作る
public final class Strings {
private Strings() {}
/** null か空文字なら true */
public static boolean isEmpty(String s) {
return s == null || s.isEmpty();
}
/** null か空白だけなら true */
public static boolean isBlank(String s) {
return s == null || s.isBlank();
}
/** null なら空文字にする */
public static String nullToEmpty(String s) {
return s == null ? "" : s;
}
/** 空白だけなら null にする(DB に入れる前の正規化) */
public static String emptyToNull(String s) {
return isBlank(s) ? null : s.strip();
}
}
プロジェクト内に判定方法が 3 種類混在すると、境界の扱いがばらつきます。1 か所に集めて全員がそれを使うのが最も効果があります。
ライブラリを使う場合
// Apache Commons Lang3
StringUtils.isEmpty(s); // null または ""
StringUtils.isBlank(s); // null または空白だけ
StringUtils.isNotBlank(s);
StringUtils.defaultString(s); // null なら ""
StringUtils.defaultIfBlank(s, "既定値");
StringUtils.trimToEmpty(s); // null なら ""、それ以外は trim
// Spring
StringUtils.hasText(s); // null でも空でもない(= 中身がある)なら true
ObjectUtils.isEmpty(s);
// Google Guava
Strings.isNullOrEmpty(s);
Strings.nullToEmpty(s);
同じ名前で意味が違う点に注意してください。Spring の hasText() は「中身がある」なので、Commons の isBlank() の否定にあたります。import を取り違えると条件が反転します。
コレクションと Optional
List<String> list = getList();
if (list == null || list.isEmpty()) { }
// 空のリストを返せば null チェックが要らなくなる
public List<String> getList() {
return results != null ? results : List.of();
}
// 値がある / ない を型で表す
Optional<String> name = findName();
if (name.isPresent()) { }
name.ifPresent(System.out::println);
String v = name.orElse("名無し");
String v2 = name.filter(s -> !s.isBlank()).orElse("名無し");
// null を Optional にする
Optional.ofNullable(s).filter(x -> !x.isBlank()).ifPresent(this::save);
「値が無い」を null ではなく空コレクションや Optional で表すと、判定そのものが減ります。Optional はメソッドの戻り値に使うもので、フィールドや引数には使いません。
null と空文字を区別する場面
| 場面 | 意味の違い |
|---|---|
| フォームの入力 | null=項目が送られていない / ""=入力欄が空 |
| データベース | NULL=未設定 / ''=空という値。検索条件が変わる |
| JSON | null=明示的に null / キーが無い=未指定 |
| 設定ファイル | 未設定なら既定値、空文字なら「無効にする」など |
-- NULL は = で比較できない
SELECT * FROM users WHERE name = ''; -- 空文字の行だけ
SELECT * FROM users WHERE name IS NULL; -- NULL の行だけ
SELECT * FROM users WHERE COALESCE(name, '') = ''; -- 両方
DB に入れる前にどちらかへ寄せておくと、検索条件が単純になります。「未入力は NULL」「空文字は保存しない」のように決めてください。
関連
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38