为什么一个物体是看不见的?

时间:2010-11-30 16:01:38

标签: java private visibility

我上课了。在这个类中,我声明了一个私有变量private Agent agent;。在我的课上我有

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

在上面的private thread中,我调用了getParameter,它是所考虑类的私有方法。在getParameter内我调用了agent的一种方法。结果我得到NullPointerException。因此,我得出结论,agent无法看到getParameter

为什么?可能是因为getParameterprivate 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();
        }
    });
}

4 个答案:

答案 0 :(得分:8)

NullPointerException与可见性无关。您可能正在调用null对象的getParameter方法。您的agent变量已声明,但未初始化。您可能想要编写类似的代码:

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

更新代码后的更新

您的代码有两个agent定义。班上的第一个:

private Agent agent;

你的run()方法中的第二个:

Agent agent = new Agent();

您的getParameter()方法不知道agent方法中定义的run()。它只知道该类的agent成员,该成员未初始化。删除agent的第二个定义时,您的问题将得到解决:

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

OLD UPDATE NullPointerException方法中会引发getParameter()。所以我理解你的代码如下:

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

如果这是您的代码,则问题仍然存在:agent未初始化。您必须在调用getParameter()方法中的任何方法之前对其进行初始化。

答案 1 :(得分:3)

代理从未初始化。你想要这样的东西:
Agent agent = new Agent();

答案 2 :(得分:2)

您似乎在实例初始值设定项中创建了这个新线程。这意味着当线程开始运行时,包含的实例可能无法完全初始化(您没有显示您调用start()的位置)。


还有一些未得到建议的建议:(1)不要继承线程,创建Runnable,以及(2)不创建自己的线程,使用ExecutorService

答案 3 :(得分:1)

同上罗马,但让我补充一点澄清点。

如果您没有对象的可见性,则在尝试编译时会收到错误消息。空指针异常是RUNTIME错误,而不是编译时错误。对于可见性问题,您永远不会得到空指针异常,原因很简单,如果您遇到可见性问题,将无法运行该程序,因为编译将失败。

空指针异常意味着您尚未将对象的实际实例分配给变量。这可能意味着你根本就没有创建过一个实例,或者它可能意味着你有一个隐藏另一个的声明,就像这里一样。