我有一个名为NewFrame.java
的GUI类,另一个是Client.java
。在Client.java中,NewFrame的对象是在一个线程内完成的。前,
public class ClientA {
NewJFrame gui;
int x ;
public void go() {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
gui = new NewJFrame();
gui.setVisible(true);
x = 10;
}
});
System.out.println(x); // does not print 10 but it prints 0
gui.setTextboxvalue("value changed !!!");
// can'se pass value to the function, with this error occurs as,
// "java.lang.NullPointerException" at here.
}
}
这里发生了两个问题,
NewFrame类中有一个名为setTextboxValue
的setter方法,但如上所示调用它会出现错误“java.lang.NullPointerException”。
另一个问题是:为什么我不能在该线程内设置变量x
,设置这个内部线程,外部打印变量x
的值为10而不是在那里打印它会打印0
答案 0 :(得分:2)
EventQueue.invokeLater
在一个单独的线程上调用它的方法,该事件在事件调度线程上的所有其他任务完成后在事件调度线程上异步触发。换句话说,run()方法中的代码可能会在您的方法完成后执行。因此,gui
变量仍然为空,当您调用NullPointerException
时会产生gui.setTextboxvalue
;打印出值时,x仍然为0。