2012-04-13 48 views
0

這是我的代碼:當遍歷一個HashMap,我得到NullPointerException異常

HashMap<String, HashSet<String>> map; 
....// I didn't write those code that initial the map. 
System.out.println(map.entrySet().size()); // run util here is ok, I get the size of the map. 
for(Map.Entry<String, HashSet<String>> entry : map.entrySet()) {// here throw the exception 
    Sytem.out.println("abc");// didn't executed, throw exception before 
} 

我得到異常:在線程

異常 「主」 顯示java.lang.NullPointerException 在key.test .EnwikiOutlink.main(EnwikiOutlink.java:68)

地圖對象有超過10,000個地圖對象,我在服務器機器上運行它,並且無法調試。 但是,當我縮小這張地圖的尺寸​​(小於10,000)時,程序運行正常。 問題的原因是什麼,解決方法是什麼?謝謝!

+4

第68行顯示調用'map.entrySet'? – 2012-04-13 11:34:25

+0

'map'初始化在哪裏? – hmjd 2012-04-13 11:34:47

+0

我不認爲突出顯示的行可以是第68行。現在可能是第68行,但是可能不是在添加println之前? – 2012-04-13 11:49:05

回答

2

map在哪裏初始化?如果你實際上沒有分配任何東西,當然它會是null

(如果它是一個類成員,或者一個局部變量目前尚不清楚。)

+0

我沒有寫它,我敢肯定地圖不是null,因爲當我打印map.entrySet()。size()的大小時,我知道了。我更新了這個問題,抱歉不清楚。 – janekey 2012-04-13 11:40:15

+0

在這種情況下,NPE必須來自另一條線路,很可能在迴路中。正如@Jon Skeet所說,第68行究竟是什麼? – 2012-04-13 11:42:23

1

如果地圖確實包含元素,那麼map.entrySet()不會拋出NullPointerException(因爲地圖不爲空),所以異常必須來自訪問循環中的一個元素(或其子對象)。

+0

實際上,地圖是否包含任何元素並不重要。 – 2012-04-13 13:17:43

+0

@MarkoTopolnik - 你是對的,entrySet()可以在空映射上工作,但不能在空引用上工作;我的觀點是:如果它實際上包含元素,它不能爲空。 – Attila 2012-04-13 14:10:07

1

我剛試過這個:它工作正常。您的地圖必須分配給null。

HashMap<String, HashSet<String>> map; 
map = new HashMap<String, HashSet<String>>(); 

for(Map.Entry<String, HashSet<String>> entry : map.entrySet()) { 

} 
+3

你必須這樣做? :-) – 2012-04-13 11:38:11

+3

@TQuatarendon我很困惑,有一個問題要求我必須嘗試。這太明顯了(如果我遇到太明顯的東西,我傾向於嘗試,只是爲了確定)。 ;) – 2012-04-13 11:40:05

0

如果map是一個局部變量(而不是一個實例字段),它是理論上是不可能得到一個NPE上map.entrySet()map.entrySet().size()已經成功,即使地圖本身是另一個線程和訪問線程以各種可以想象的方式改變它。如果您的堆棧跟蹤中的第一個條目是您的代碼的一行,而不是一些從您的代碼中調用的代碼,那麼唯一的辦法就是map變量本身爲null。因此我認爲你需要重新審視你的診斷線索。

相關問題