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

Rom*_*man 0 java visibility private

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

private Thread controller = new Thread() {
...
}
Run Code Online (Sandbox Code Playgroud)

在上面private thread我调用getParameter哪个是所考虑类的私有方法.在getParameter我称之为的方法之一agent.结果我得到了一个NullPointerException.因此,我得出结论,agent从中看不到getParameter.

这是为什么?可能是因为它getParameter是在private Thread?而且,如果是这样的话,如何解决所描述的问题?

添加

我意识到我需要更加具体.我的代码组织如下:

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();
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)

添加2 在GameWindow中我有:

public void startWindow() {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            controller.start();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*des 8

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

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

更新代码后的更新

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

private Agent agent;
Run Code Online (Sandbox Code Playgroud)

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

Agent agent = new Agent();
Run Code Online (Sandbox Code Playgroud)

您的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();
 }
Run Code Online (Sandbox Code Playgroud)

OLD UPDATE:NullPointerException抛出getParameter()方法内部.所以我理解你的代码如下:

private Something getParameter() {
    agent.someMethod(); // exception thrown here
}
Run Code Online (Sandbox Code Playgroud)

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