リストや配列の要素が 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 の順だと、item が null のとき 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の違いは?
A
isEmpty() は長さ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安全な処理に強くなれます。
