2010-08-17 91 views
1

我有一個填充字符串數組的HashMaprMap)的函數。一旦滿足某些條件,例如r.Map.size() != 0然後我在另一個文件中(rMap是一個全局變量)從此嘗試調用以下String array[] = rMap.get(0)我嘗試到System.out.println(array[0])移動數據時出現空指針

這就是程序的運行,我得到一個空指針System.out.println(array[0]);。任何人有任何想法爲什麼會發生這種情況

編輯:我填補地圖像這樣..

String center[] = new String[] { tname, tmessage, tlink, tsname }; 
Global.rMap.put(index, center); 

當陣列中的所有值變量都是字符串。所以我訪問它的值tname並且它不等於null。我查過了。我的密鑰值是一個字符串

+0

你可以添加多一點的代碼,所以我們可以明確地看到你的設置索引? – atk 2010-08-17 14:22:16

回答

0

HashMap允許空值,因此您使用String array[] =rMap.get(0);獲得的值可能爲空。訪問空數組然後拋出NPE。

1

你是如何填寫地圖?你確定你正在把一個Integer鍵爲0的非空條目放入它嗎?

那麼,我們可以肯定你不是。可能的原因:

  • 以導致填充代碼中的錯誤預期放不被執行,或者使用不同的密鑰值
  • 您使用ShortByte對象作爲鍵
  • 你把一個null值到地圖下的0關鍵

您可以通過在調試器中運行代碼,看地圖的內容,回答自己這個問題。

更新:

我的Key值是一個字符串

嗯,那是你的問題就在這裏。 rMap.get(0)將查找Integer,並且它將不匹配字符串"0"的條目。

+0

已更新我的代碼以反映您的問題。 – Skizit 2010-08-17 11:14:41

+0

@Meowmix:更新了答案以反映您的更新。 – 2010-08-17 12:17:52

1

array引用爲空,很可能是因爲沒有值(或null)已被添加到rMap,密鑰0

如果可能,請使用泛型來確保您的密鑰是正確的類型。您也可以在獲取array之前打印出地圖的值,以查看地圖中的內容。通過調試器逐步瀏覽代碼,rMap上的手錶也將顯示地圖包含的內容以及更改時間。

0

Hashmap的get()方法使用鍵而不是索引來標識要獲取的值。如果你想要一個有序的項目列表,你需要使用一個List子類(或強制執行排序,yaourself)。如果您想使用Hashmap,請使用keys()方法來枚舉所有地圖的鍵。

(以上文字刪除,由於質疑澄清。下方留下文字,即使它不是問題,這是一個重要的考慮因素)

此外,你必須非常小心,不要製造競爭條件,因爲你正在跨線程工作。雖然Java的本地哈希表是同步的,但這並不意味着它的數據是。也就是說,您可以在一個htread中使用MyObj obj = get(xxx),Nd開始在兩個單獨的線程中操作obj,可能會彼此相加。根據您的應用程序,您可能希望使用Hashtable.remove(),以便數據從映射中消失並且不能被重用,或者您可能需要一些同步塊(remove()可能是更簡單的實現,thoguh你必須優雅地處理地圖首先有數據的情況,然後數據不見了)。

0

當您調用Map實現的get方法時,這是一個問題,java.util.Map的get方法的簽名是get(java.lang.Object),因此任何對象都將被接受爲它的參數。

工作正常的關鍵是傳遞一個字符串(值爲0)作爲鍵或覆蓋hashCode並等於不是java.lang.String對象的參數對象的方法。