2012-07-23 76 views
0
class Monitor { 
    TheManager manager; 
    Map<String, Subject> subjectMap; 
    public Monitor() { 
    TheManager manager = new TheManager(); 
    Map<String, Subject> subjectMap = new HashMap<String, Subject>(); 
    } 

    public void addObject(String objName, Object obj) { 
    if(objName == null) System.out.println("name null"); 
    if(obj == null) System.out.println("obj null"); 
    if(manager == null) System.out.println("manager null"); 
    manager.addObject(objName, obj); 
    } 
} 

我得到一個空指針異常,因爲管理器爲空。我已經在代碼中的其他地方實例化了Monitor對象。當我嘗試使用「addObject」方法時,在打印「manager null」(因爲它顯然)之前,它給了我NPE。在Java中,任何人都可以解釋爲什麼這個對象爲空?

我覺得我錯過了這裏非常基本的東西......任何人都可以幫忙嗎?

+0

請注意,如果您已經創建了manager和subjectMap'final',那麼編譯器會發現您的錯誤。 – Neil 2012-07-23 23:06:35

+0

你能解釋一下這是爲什麼嗎?如在最後,什麼? – Archer 2012-07-23 23:13:03

+1

'final'要求您只給變量賦值一次。在類成員的情況下,它迫使你在構造函數中進行賦值,這在這段代碼中是合理的,儘管不一定在完成的代碼中。如果您忘記分配成員,那麼該類將無法編譯。 – Neil 2012-07-23 23:26:47

回答

6

你的構造函數中包含

TheManager manager = new TheManager(); 

,而不是

this.manager = new TheManager(); 

同一遊戲subjectMap

+0

'this.'當然不是絕對必要的,但它確實有助於在這種情況下更加明確。 – dimo414 2012-07-23 22:58:16

+0

我認爲對象被聲明:type name = new type(); 我們爲什麼要使用關鍵字「this」? – Archer 2012-07-24 01:18:22

+0

你不「聲明對象」。你所做的是:a)「聲明一個新的引用」('type name'部分)和b)「創建一個新的實例」('new type()'部分)和c)「指向引用實例「('='部分)。意外地,新引用的名稱「隱藏」對象中的變量。所以a)沒有必要,因爲你已經有了一個引用 - 在你的'Monitor'實例中。然後c)是錯誤的,你想'Monitor.manager'指向新的實例。 – 2012-07-24 07:48:40

2

您從不指定管理員,即對象的字段。 在你的構造函數中,你正在分配一個局部變量。 變量會影響您的字段。

1

您正在定義managersubjectMap兩次。一旦進入構造函數,一次進入課堂。在構造函數中分配它們時,它們在構造函數的範圍內,而不在類中。您需要刪除構造函數中的聲明。

1

我無法解釋它在Java中,但我可以用英語:P你有可變

TheManager manager; 

一個實例,沒有設置任何東西

通知。然後,在你的構造函數創建一個不同變量:

TheManager manager = new TheManager(); 

這在構造函數的末尾超出範圍。爲了引用實例變量而不是新的本地變量,請從構造函數的行首開始刪除TheManager

相關問題