2010-11-30 100 views
0

我有一堂課。在這個類中,我聲明瞭一個私有變量private Agent agent;。在我的課堂我有爲什麼一個物體不可見?

private Thread controller = new Thread() { 
... 
} 

在上述private thread我打電話getParameter這是考慮類的私有方法。在getParameter內我打電話agent的方法之一。結果我得到了NullPointerException。因此,我認爲agentgetParameter不可見。

這是爲什麼?難道這是因爲getParameter是在private Thread?而且,如果是這樣的話,所描述的問題如何解決?

ADDED

我意識到,我需要更加具體。我的代碼被組織這樣的:

public class GameWindow { 
    ... 
    private Agent agent; 
    ... 
    private Thread controller = new Thread() { 
     public void run() { 
      ... 
      Agent agent = new Agent(); 
      ... 
      parameter = getParameter(); 
     } 
    } 
    ... 
    private String getParameter() { 
    ... 
    agent.someMethod(); 
    ... 
    } 
} 

加入2- 在GameWindow我:

public void startWindow() { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      controller.start(); 
     } 
    }); 
} 
+0

那麼什麼樣的代碼初始化`GameWindow.agent`? – Anon 2010-11-30 16:36:13

+0

什麼代碼啓動`controller`線程運行? – Anon 2010-11-30 16:36:28

+0

@Anon,我已添加詳細信息。 – Roman 2010-11-30 16:40:39

回答

8

NullPointerException與知名度無關。您可能正在調用空對象的getParameter方法。您的agent變量已聲明,但未初始化。您可能要編寫類似:

private Agent agent; 
private Thread controller = new Thread() { 
    agent = new Agent(); 
    // ... 
    agent.getParameter(); // should not throw a NullPointerException 
} 

更新後CODE加入

您的代碼有agent兩個定義。第一個在類:

private Agent agent; 

,第二個你run()方法內:

Agent agent = new Agent(); 

getParameter()方法不知道run()方法內部定義的agent。它只知道該類的agent成員,該成員未初始化。

public void run() { 
     ... 
     // Agent agent = new Agent(); 
     agent = new Agent(); // works fine: you are initiliazing the class member 
     ... 
     parameter = getParameter(); 
} 

舊的更新:當您刪除的agent第二個定義您的問題將得到解決 的NullPointerExceptiongetParameter()方法內拋出。所以,我理解你的代碼是這樣的:

private Something getParameter() { 
    agent.someMethod(); // exception thrown here 
} 

如果這是你的代碼,這個問題仍然是相同的:agent未初始化。在調用getParameter()方法中的任何方法之前,您必須初始化它。

3

代理從未被初始化。你想要的東西是這樣的:
Agent agent = new Agent();

2

您似乎是在實例初始值設定項中創建此新線程。這意味着當線程開始運行時,包含的實例可能不會完全初始化(您不會顯示您要撥打start()的位置)。


而一些沒有提出的,徵求意見:(1)不繼承線程,創建一個Runnable,和(2)不要創建你自己的線程,使用ExecutorService

1

同上羅馬,但讓我加一個澄清點。

如果您沒有對某個對象的可見性,那麼當您嘗試編譯時,將會收到錯誤消息。空指針異常是RUNTIME錯誤,而不是編譯時錯誤。對於可見性問題,永遠不會得到空指針異常,原因很簡單,因爲編譯將失敗,因此如果存在可見性問題,將無法運行該程序。

空指針異常意味着您沒有將對象的實際實例分配給變量。這可能意味着你從來沒有創建過一個實例,也可能意味着你有一個隱藏另一個的聲明,就像這裏。