2013-10-24 11 views
0

隨着社會管理我的幫助的陣列中的一員問題得到這個問題很好解決:How to convert String to the name of the Array?與調用字符串

但現在我得到「NullPointerException異常」。下面是我的代碼使用方法:

public class IroncladsAdder 
{ 
public static String weaponId = null; 
public static String ship = null; 
public static String wing = null; 

//map code 
private static Map<String, List<Integer>> arrays = new HashMap<String, List<Integer>>(); 
public void Holder(String... names) { 
    for (String name : names) { 
     arrays.put(name, new ArrayList<Integer>()); 
    } 
} 

//adds weapons to fleets and stations 
public static void AddWeapons(CargoAPI cargo, String fac, int count, int type) { 

    String arrayName = null; 

    int quantity = (int) (Math.random()*5f + count/2) + 1; 
    if (count == 1) {quantity = 1;} 

    if (type == 0) {arrayName = fac+"_mil_weps";} 
    else if (type == 1) {arrayName = fac+"_civ_weps";} 
    else {arrayName = fac+"_tech_weps";} 

    List<Integer> array = arrays.get(arrayName); 

    for (int j = 0; j <= count; j++) 
    { 
     weaponId = valueOf(arrays.get(arrayName).get((int) (Math.random() * arrays.get(arrayName).size()))); 
     cargo.addWeapons(weaponId, quantity); 
    } 
} 

這裏是數組的一個例子:

//high-tech UIN weapons 
private static String [] uin_tech_weps = 
     { 
       "med-en-uin-partpulse", 
       "lrg-en-uin-partacc", 
       "med-bal-uin-driver", 
       "lrg-bal-uin-terminator", 
       "lrg-bal-uin-hvydriver", 
       "lrg-bal-uin-shotgundriver", 
       "lrg-en-uin-empbeam", 
     }; 

錯誤指示,什麼是錯用這種結構:

weaponId = valueOf(arrays.get(arrayName).get((int) (Math.random() * arrays.get(arrayName).size()))); 

注:i` m使用Intellij IDEA和Java 6.大多數情況下,應用程序對某些錯誤提供建議/修復,在這種情況下顯示一切正常。

我需要的是從特定數組中獲取字符串(即使用代碼生成的名稱)並將其分配給'weaponId'。

+1

你的例外在哪裏? –

+0

看起來'array.get(arrayName)'爲空。通過明確地檢查前面的行來驗證/反駁這一點。 Holder構造函數的調用者通過了什麼?你列出你的'uin_tech_weps',但不是那個和'arrays'之間的連接。 – CPerkins

+0

異常是'java.lang.NullPointerException',它指向字符串64,這正是'weaponId = ...'部分。它沒有提供任何其他細節。 – Okim

回答

1

當您的應用程序啓動映射並且數組爲空時,那麼當您嘗試獲取名稱爲X的數組時,您將返回一個空值。

第一種解決方案:在啓動/施工時使用空陣列/列表填充所有陣列名稱。

第二種解決方案:使用這種方法來獲得數組。

protected List<Integer> getArray(String arrayName) { 
    List<Integer> array = map.get(arrayName); 
    if (array == null) { 
    array = new ArrayList<Integer>(); 
    map.put(arrayName, array); 
    } 
    return array; 
} 

P. 您可以更改此代碼:

weaponId = valueOf(arrays.get(arrayName).get((int) (Math.random() * arrays.get(arrayName).size()))); 

weaponId = valueOf(array.get((int) (Math.random() * array.size()))); 
+0

我的IDEA告訴Map.get(arrayName)不能從靜態內容中引用,並且不提供解決方法來解決這個問題。 – Okim

+0

在「填充地圖」下,你的意思是手動放置arrayName?像這樣:'Map.put('uin_tech_weps',array)'? – Okim

+0

如果您想從其他靜態方法訪問它,請將getArray數組設置爲靜態。 – Fedy2

0

確定。現在有一個不同的錯誤 - 「java.lang.IndexOutOfBoundsException:指數:0,大小:0」

使代碼如下所示:

private static Map <String, List<Integer>> arrays = new HashMap<String, List<Integer>>(); 

public static List<Integer> getArray(String arrayName) { 
    List<Integer> array = arrays.get(arrayName); 
    if (array == null) { 
     array = new ArrayList<Integer>(); 
     arrays.put("rsf_civ_weps", array); 
     arrays.put("rsf_mil_weps", array); 
     arrays.put("rsf_tech_weps", array); 
     arrays.put("isa_civ_weps", array); 
     arrays.put("isa_mil_weps", array); 
     arrays.put("isa_tech_weps", array); 
     arrays.put("uin_mil_weps", array); 
     arrays.put("uin_tech_weps", array); 
     arrays.put("uin_civ_weps", array); 
     arrays.put("xle_civ_weps", array); 
     arrays.put("xle_mil_weps", array); 
     arrays.put("xle_tech_weps", array); 
    } 
    return array; 
} 

這是我現在該怎麼調用數組和weaponId :

List<Integer> array = arrays.get(arrayName); 

for (int j = 0; j <= count; j++) 
    { 
     weaponId = valueOf(array.get((int) (Math.random() * array.size()))); 
     cargo.addWeapons(weaponId, quantity); 
    } 

什麼問題?

+0

錯誤再次指向'weaponId = ...'部分。 – Okim