2012-07-30 102 views
0

我有一個類的數組作爲實例變量/字段,它從另一個類傳遞到第一個方法。 我的印象是,我也應該能夠從另一種方法訪問它,而不會將它傳遞給該方法,但是當我嘗試時,我會得到一個NPE。數組作爲實例變量作爲參數傳遞

下面的代碼:

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() { 

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

當第一方法被稱爲我得到印刷到表示數組的長度的控制檯,但一個整數,當第二方法被稱爲它的NPE,提示不相同的數組。

通過單擊GUI上的按鈕調用第二種方法。與此按鈕相關的方法只有一個電話:

PLoop.accessArray(); 

任何人都可以告訴我,我做錯了什麼?

CNC中 這些方法的調用來自兩個不同的類,每個聲明PLoop的一個實例:

proc = new PLoop(); 
+2

你在'memPass'之前調用'accessArray'嗎? (或在另一個對象上?) – 2012-07-30 12:47:00

+0

您已將此簡化爲代碼不會顯示問題的點。只要你在同一個對象上調用兩個方法,這段代碼就可以完美工作。如果你用不同的物體稱呼它們,那麼那就是另一個故事。 – 2012-07-30 12:47:59

+0

首先調用memPass,然後單擊GUI上的一個按鈕來調用accessArray。 – Robert 2012-07-30 12:48:16

回答

1

在PLoop方法班級不是靜態的 您仍在撥打PLoop.accessArray();

請問您可以告訴真實場景是什麼?

就像@Jon Skeet告訴代碼似乎很好。唯一的可能是你可能在 之外執行它們,或者你可能在調用第一個 方法之後搞亂了memLocList。

+0

對不起,它實際上寫爲「proc = new PLoop;」在gui的主要構造函數中,然後是「proc.accessArray();」在調用它的方法中。 – Robert 2012-07-30 19:29:27

+0

是否在調用method1之後調用method2? – Byter 2012-07-31 04:57:05

+0

是的。在方法1已經打印到控制檯之後,通過單擊GUI上的按鈕調用方法2。 – Robert 2012-08-01 00:28:13

3

我強烈懷疑,你叫上了memPass實例不可您稍後調用accessArray的同一個實例。

如果您使用相同的實例,這應該是絕對沒問題的。 (特別是它的值將被存儲的說法,所以它不是像memList可以成爲空後不被空,只是由於改變在其他地方。)

3

類中的代碼,你已經證明長相很好,所以如果你得到了一個N​​PEx,那麼這些方法就會被調用失序,或者第二個方法調用正在PLoop的另一個實例上進行。

要檢查呼叫正在對同一對象上進行與否,嘗試打印出的this你的方法裏面的值,並檢查值是相同的:

System.out.println(this); 
+0

感謝您的提示 - 我確實得到了不同的值: PLoop @ 79024994 - 第一種方法和第二種PLoop @ 78cade31。 – Robert 2012-07-30 19:25:16