2010-11-30 87 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错误,而不是编译时错误。对于可见性问题,永远不会得到空指针异常,原因很简单,因为编译将失败,因此如果存在可见性问题,将无法运行该程序。

空指针异常意味着您没有将对象的实际实例分配给变量。这可能意味着你从来没有创建过一个实例,也可能意味着你有一个隐藏另一个的声明,就像这里。