2012-07-27 95 views
0

我有需要的陣列作爲一個參數從另一個類的方法:訪問元素 - 爪哇

public void memPass(Memory[] memLocList) { 

    memList = memLocList; 

      for (int i = 0; i < 10; i++) { 
     System.out.println(memList[i].getSomething()); 
    } 
} 

CNC中 上面打印出10個值(整數),但如果我在另一個方法中嘗試使用0 & 10之間的整數,我會得到一個NPE。

任何人都可以告訴我如何從另一個方法訪問此數組的元素,這也從另一個類獲取參數?

我試圖做的東西沿着這些路線:

public void accessArray(int mem) { 

      int someInt = memList[mem].getSomething(); 
} 

CNC中對不起,我要補充一點,這給出了一個NullPointerException異常。

-NEW編輯 -

行,我現在已經編輯的代碼,以便所有我在類是:

public class PLoop { 

// instance variable 
public Memory[] memlist; 

    // method 1 
    public void memPass(Memory[] memLocList) { 

    memList = memLocList; 
    System.out.println(memList.length); 
    } 

    // method 2 
    public void accessArray(int mem) { 

    System.out.println(memList.length); 
    } 
} 

第一種方法打印代表「的memlist的長度的整數「第二個給NPE。

+1

你有什麼看起來足夠合理。 [SSCCE](http://sscce.org)怎麼樣? memPass()實際上是否被調用? 「memLocList」的值是什麼?您是否嘗試過使用調試器來確定_what_爲空? – 2012-07-27 19:10:36

+0

是同一類的memPass()和accessArray()方法嗎? memList是該類的成員變量嗎?如果對兩者都是,那麼你已經寫在這裏的代碼按原樣運行。 – DGH 2012-07-27 19:10:53

+1

看看你的問題標籤'nullpointerexception',這意味着在'memList'的'mem'索引處有'null'值,你正試圖使用​​'getSomething()'。或者'memList'爲空(這與前面方法中的'memList'不同) – Xeon 2012-07-27 19:11:58

回答

3

如果我正確地理解你,你希望能夠存儲memLocList然後訪問它?如果是這樣,我看不到創建實例變量是行不通的。

public class Test { 
    public Memory[] memlist; 

    public void memPass(Memory[] memLocList) { 
     memList = memLocList; 
    } 

    public void accessArray(int mem) { 
     int someInt = memList[mem].getSomething(); 
    } 
} 

當然,我並不在Java中足夠任何更多的工作,所以它可能不是可以創建並分配這樣一個實例變量。但是你總是可以將元素存儲在另一個容器中。

public class Test { 
    public List<Memory> memlist; 

    public void memPass(Memory[] memLocList) { 
     memlist = new ArrayList<Memory>(Arrays.asList(memLocList)); 
    } 

    public void accessArray(int mem) { 
     int someInt = memList.get(mem).getSomething(); 
    } 
} 

對不起,如果我有任何語法錯誤。但你明白了主意。

+0

我實際上只設法通過將這兩個方法移動到與數組相同的類而不是將該數組作爲參數傳遞來實現這個工作。 – Robert 2012-08-05 12:01:20

1

如果memList是該類的一個實例變量,並且在兩種情況下(兩種方法)都是相同的類,那麼顯然這在memList的某個索引處的值爲null

private static class Memory { 
    private static int index = 0; 

    public int getSomething() { 
     return index++; 
    } 
} 

private static class Test { 
    public Memory[] memlist; 

    public void memPass(Memory[] memLocList) { 
     memlist = memLocList; 
    } 

    public void accessArray(int mem) { 
     int someInt = memlist[mem].getSomething(); 
     System.out.println(someInt); 
    } 
} 
public static void main(String args[]) { 
    Test t = new Test(); 
    Memory[] memList = new Memory[4]; 
    memList[0] = new Memory(); 
    memList[1] = null; 
    t.memPass(memList); 
    t.accessArray(0); 
    t.accessArray(0); 
    t.accessArray(1); //NPE thrown because null value in array 
    //or 
    Test t2 = new Test(); 
    t2.accessArray(0); //NPE thrown because array is null (different instance) 
} 
1

在您的實施,已經假設數組被傳遞給方法有10個元素,並且每個陣列項目具有價值,因此,在某些時候你遇到一個NullPointerException。這是很危險的,特別是當你正在處理作爲參數傳遞給該方法的數組時。爲了確保您只訪問數組中可用的元素,您需要檢查數組的長度。此外,您需要確保無論何時調用數組中的元素的方法(或者對其執行任何操作),請首先檢查它是否實際存在。爲了您的for循環中,你可以做這樣的事情:

if (memList != null) { 
    for (int i = 0; i < memList.length; i++) { 
     if (memList[i] != null) { 
     System.out.println(memList[i].getSomething()); 
     } 
    } 
} 

這樣,它是空指針異常安全。使用相同的概念,你也可以將它應用到你的方法是這樣的:

public void accessArray(int mem) { 

    if (mem > -1 && memList != null && memList.length > mem && memList[mem] != null){ 
     int someInt = memList[mem].getSomething(); 
    } 
} 

當然,這是假設在for循環和accessArray方法,該方法是在同一個類(或親子班)和memList是一個實例變量。

並且將數組的元素保存爲memLocList的深層副本,您可以使用@GJK建議的哪個爲Arrays.asList作爲實例變量,並應用上面提到的相同概念的空指針檢查。