2013-04-28 68 views
0

很久以前,我從我的前同事那裏得到了代碼,但是我無法讓它工作。Map類中的NullPointerException

使用調試器我的結論是,我的學生都在這個方法突破點:

((Map<String, List<byte[]>>)metaData).put(HEADERELEMENTS, headerOMElements); 

put方法聲明 - String key, List <byte[]> value。我也試過

((Map<String, List<byte]>>)metaData).put("HEADERELEMENTS",headerOMElements); 

但是情況是一樣的。我的printStackTrace返回NullPointerException。 我做的headerElements

number of headerOMElements (headerOMElements.size();)=1 
headers are(before calling the method PUT) (headerOMElements.toString();): [[[email protected]] 

記錄如何斷定是什麼問題,如何解決?我不是高級Java專家,所以我真的需要幫助。

+0

是你的元數據地圖空? – duffy356 2013-04-28 10:54:45

+0

問題在於某些外部類正在定義該元數據並調用此類的主要方法。你的意思是用isEmpty或size方法檢查它嗎? – 2013-04-28 10:59:18

+0

當調試metaData.put(...) – duffy356 2013-04-28 11:00:46

回答

3

基於有限的信息,您所提供,並假設它是正確的,一個NullPointerException可以在這一點上拋出的唯一可能途徑是,如果metaDatanull

所以......

修改代碼,立即,你相信NPE被拋出的語句之前打印出來的metaData價值;例如

System.err.println("metaData is " + metaData); 

如果輸出顯示metaDatanull,那麼下一步就是檢查你的代碼找出爲什麼這是null。有可能你沒有初始化它,或者你從別的地方通過它,它也是null

如果輸出顯示metaData不是null,那麼您在問題中陳述的事實/假設之一必須是錯誤的。對於進一步的診斷,我們需要:

  • 真正代碼,複製和粘貼(不喜歡你似乎已經完成了...基礎上,錯別字鍵入),並
  • 完整堆棧跟蹤。

1 - 對於某些類型的Map你也可以得到一個NPE如果關鍵是null。但是,該例外將在put()方法調用內拋出。另外,當你使用文字字符串作爲關鍵字時,你說你會遇到同樣的問題。所以這不能解釋。唯一可能的解釋是有多個線程更新地圖而沒有同步。這可能會給出一個NPE(隨機),但是NPE將在put或其他一些Map實例的方法中。

+0

謝謝斯蒂芬......是的,它回報了我,元數據爲空。但我正在其他一些班級發起。也許其他一些類也在後面啓動它,因爲這是一些有很多默認類的IBM應用程序。有沒有辦法我可以找出哪個班級正在啓動,並且將這個班級稱爲我的班級?謝謝 – 2013-04-28 12:33:17

+0

你可以找到的唯一方法是通過讀取代碼,並通過調用回到'null'開始其生命的地方。 – 2013-04-28 12:39:30

+0

metaData在方法定義中聲明。所以我想這是從某個地方(我假裝找到的其他一些地方)調用這個方法。追溯到找到調用此類的這個方法的類的方法是什麼?有些提示,請將快捷方式返回給正在調用此類的類(在系統中有大約10000個類,因此很難找到)。同時,我將回答標記爲回答 – 2013-04-28 12:49:12

1

如果在放入地圖之前要放入地圖的數據不爲空,那麼您的地圖可能爲空,並且您會得到NullPointerException。

或 異常在其他地方拋出。

+0

metaData爲空。我找不到放置它的地方。在這個方法中,它只是被調用,它在方法 – 2013-04-28 12:50:18

+0

hmm的聲明中。如果它爲空,也可以爲引用創建一個新的Map對象。 – duffy356 2013-04-28 12:54:32

+0

如何創建元數據的新實例?這是正確的表達式Map metaData = new HashMap ();因爲我很困惑,因爲這個表達式:(Map >)元數據 – 2013-04-28 16:08:14