我上课了。在这个类中,我声明了一个私有变量private Agent agent;
。在我的课上我有
private Thread controller = new Thread() {
...
}
在上面的private thread
中,我调用了getParameter
,它是所考虑类的私有方法。在getParameter
内我调用了agent
的一种方法。结果我得到NullPointerException
。因此,我得出结论,agent
无法看到getParameter
。
为什么?可能是因为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 :(得分: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错误,而不是编译时错误。对于可见性问题,您永远不会得到空指针异常,原因很简单,如果您遇到可见性问题,将无法运行该程序,因为编译将失败。
空指针异常意味着您尚未将对象的实际实例分配给变量。这可能意味着你根本就没有创建过一个实例,或者它可能意味着你有一个隐藏另一个的声明,就像这里一样。