java - 为什么物体是看不见的?

标签 java private visibility

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

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

在上面的私有(private)线程中,我调用getParameter,它是所考虑的类的私有(private)方法。在getParameter 中,我调用agent 的方法之一。结果我得到了一个NullPointerException。因此,我得出的结论是,从 getParameter 中看不到 agent

这是为什么呢?难道是因为getParameter私有(private)线程中?如果是这样,所描述的问题如何解决?

已添加

我意识到我需要更具体。我的代码是这样组织的:

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 在游戏窗口中我有:

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

最佳答案

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

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

添加代码后更新

您的代码有两个agent定义。类(class)第一名:

private Agent agent;

run() 方法中的第二个:

Agent agent = new Agent();

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

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

旧更新: NullPointerExceptiongetParameter() 方法中抛出。所以我知道你的代码如下:

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

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

关于java - 为什么物体是看不见的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4315742/

相关文章:

java - 创建一个二维面板数组,每个面板根据之前设计的类绘制自己的形状

java - 如何知道已经创建并运行了多少个线程?

java - 余额在 SavingsAccount1 中具有私有(private)访问权限,并且不允许我在FlexibleSavingsAccount1 中访问它

java - 设计决策 : Why and when to make an interface private?

java - 显示/隐藏特定 fragment 的 BottomNavigationView

c# - Graphics.IsVisible(Rectangle rect) 的文档有误吗?

Java:将具有不同类型的参数传递给函数

java - Vaadin 将新列添加到现有表

c++ - 作为类成员的函数的定义

java - 如何将@UiField 字段设为私有(private)