1. 程式人生 > >foreach迴圈報NPE空指標異常

foreach迴圈報NPE空指標異常

前言

最近debug時忽然發現,如果一個集合賦值為null,那麼對該集合進行foreach迴圈(也叫增強for迴圈)時,會報NPE(即空指標異常NullPointerException)。

程式碼如下:

final List<String> list = null;
// final List<String> list = new ArrayList<>();
for (final String string : list) {
    System.out.println(string);
}

執行時報錯如下:

Exception in thread "main" java.lang.NullPointerException
at com.lewis.test.TestLewis.main(TestLewis.java:42)

一時間很驚奇,因為在我印象中,foreach迴圈在遇到null的集合時,應該是會自動跳過去不進行遍歷的才對。於是修改程式碼如下:

//final List<String> list = null;
final List<String> list = new ArrayList<>();
for (final String string : list) {
    System.out.println(string);
}

執行後發現沒有報錯,看來是以前記錯了。foreach迴圈只會自動跳過遍歷空的集合,如果對於null值的集合,就會直接報NPE。

解決方法

在寫業務邏輯時難免會遇到遍歷集合的情況,這時候應該先判斷集合是否為null再進行遍歷,可以使用Apache的工具類CollectionUtils。

另外補充下,foreach迴圈內部是使用的迭代器來遍歷,也就是說,這種遍歷方式和使用迭代器來遍歷是一樣的。