【Java】リストの項目が空でないか確認して使う方法|null・空文字・空白の安全な判定

リストや配列の要素が null や空文字のまま処理に渡ると、NullPointerException や想定外の動作の原因になります。そこで「空でないか確認してから使う」のが安全です。この記事では、null・空文字・空白を正しく弾く判定方法と、Streamでの安全な処理までまとめます。

この記事の結論:if (item != null && !item.isEmpty()) のようにnull判定を先に書くのが基本です(短絡評価でNPEを防ぐ)。空白のみも弾くなら isBlank()(Java 11+)、リスト全体を処理するなら Streamの filter が便利です。
スポンサーリンク

nullと空文字を確認してから使う

取り出した要素が null でなく、かつ空文字でもないことを確認します。次の例では、null(インデックス1)と空文字(インデックス3)が自動的に除外されます。

null・空文字を弾いて使う
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", null, "Banana", "", "Cherry");

        for (String item : list) {
            if (item != null && !item.isEmpty()) {
                System.out.println("使用: " + item);
            }
        }
        // 出力: Apple / Banana / Cherry(null と "" は除外)
    }
}
判定の順番が重要です。item != null先に書きます。もし !item.isEmpty() && item != null の順だと、itemnull のとき null.isEmpty() となりNullPointerExceptionになります。Javaの && は短絡評価なので、null判定を先に置けば安全です。
null判定そのものはisNullでnullの判定を行う方法、空判定はisEmptyメソッドの使い方で詳しく解説しています。

空白のみも弾きたいならisBlank(Java 11+)

isEmpty() は長さ0だけを「空」とみなすため、" "(スペースのみ)は空とみなされません。空白だけの項目も弾きたい場合は、Java 11以降の isBlank() を使います。

isBlankで空白のみも除外
List<String> list = Arrays.asList("Apple", "   ", "Banana");

for (String item : list) {
    if (item != null && !item.isBlank()) { // 空白のみも除外
        System.out.println("使用: " + item);
    }
}
// 出力: Apple / Banana("   " は除外)

Streamのfilterで全件をまとめて処理する

リスト全体から「空でない項目だけ」を取り出すなら、Stream APIの filter が簡潔です。

filterで空でない要素だけ処理
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

List<String> list = Arrays.asList("Apple", null, "", "Banana");

// 空でない要素だけ処理
list.stream()
    .filter(s -> s != null && !s.isEmpty())
    .forEach(s -> System.out.println("使用: " + s));

// 空でない要素だけを新しいリストに集める
List<String> valid = list.stream()
    .filter(s -> s != null && !s.isEmpty())
    .collect(Collectors.toList());

特定インデックスを使うときの注意

特定のインデックスを list.get(index) で取り出す場合、インデックスがリストの範囲外だと IndexOutOfBoundsException になります。事前にサイズを確認しましょう。

範囲外アクセスを防ぐ
int index = 3;
if (index >= 0 && index < list.size()) {
    String item = list.get(index);
    if (item != null && !item.isEmpty()) {
        System.out.println("使用: " + item);
    }
}
リストの先頭要素を安全に取り出す方法(Optionalなど)はリストの先頭要素を取得する方法が参考になります。

よくある質問(FAQ)

Qnullチェックと空チェックの順番はどちらが先ですか?
Anullチェックを先に書きます(item != null && !item.isEmpty())。&& は短絡評価なので、nullなら後ろの isEmpty() は評価されず、NullPointerExceptionを防げます。
QisEmptyとisBlankの違いは?
AisEmpty()長さ0だけを空とみなします。isBlank()(Java 11+)は空白だけの文字列も空とみなします。スペースのみの入力も弾きたいなら isBlank() を使ってください。
Qリスト全体から空でない要素だけ取り出すには?
AStreamの filter が簡潔です。list.stream().filter(s -> s != null && !s.isEmpty()).collect(Collectors.toList()) で空でない要素だけの新しいリストが得られます。
Qget(index)でエラーになります。
Aインデックスがリストの範囲外だと IndexOutOfBoundsException になります。index >= 0 && index < list.size() で範囲を確認してから get() してください。

まとめ

リスト項目を安全に使うポイントを整理します。

  • nullチェックを先にitem != null && !item.isEmpty()
  • 空白のみも弾くなら isBlank()(Java 11+)
  • 全件処理は Streamの filter が簡潔
  • 特定インデックスは index < list.size() で範囲確認

関連として、isEmptyメソッドの使い方isNullでnullの判定を行う方法リストの先頭要素を取得する方法もあわせて読むと、Javaのリスト・null安全な処理に強くなれます。