有一个名为r1
的可运行方法
Runnable r1=new Runnable(){
@Override
public void run(){
//some code here
}
};
我创建了一个线程
th1
Thread th1;
现在,在我的主框架的激活窗口中,我这样写:
private void formWindowActivated(java.awt.event.WindowEvent evt) {
setLocationRelativeTo(null);
Thread th1=new Thread(r1); //For those who want to know I initialized the thread twice that was the problem damn!
th1.start();
}
然后,在极少数情况下,当线程
f1
仍在运行时,用户迅速传递到名为th1
的子框架时,我希望它显示一个加载屏幕,暂时没有简单的gif效果。该加载框架称为“加载”。所以,我这样写:
private void f1formWindowActivated(java.awt.event.WindowEvent evt) {
f1.setLocationRelativeTo(null);
while(th1.isAlive())
{
loading.setVisible(true);
}
loading.dispose();
}
这是我得到一个
null pointer exception
的问题,问题出在这一行:th1.isAlive()
如果我发表评论,这一切都很好。
PS:
我从原始代码中删除了很多代码,以免麻烦,但我可以肯定其余的代码都能正常工作。另外,我用netbeans编码。而且,如果这很重要,我还有另一个名为
th
的线程,但是直到您单击jButton
中出现的f1
为止,该线程才能启动,希望此信息足够。救命。谢谢编辑:
线程
th1
是global
th1
总是首先被初始化,实际上该线程甚至开始运行,一直保持运行状态,直到f1
的窗口激活事件为止。 最佳答案
Thread th1 =...
创建一个新的局部变量,该局部变量将隐藏全局变量。
其他可能的原因:仅当用户必须先激活formWindow
时,您的代码才有效。如果不是这种情况,则永远不会创建线程。
更好的解决方案是在加载屏幕可见的情况下创建表单f1
,并在线程末尾禁用该表单。
如果不是这种情况,则可能有两个变量th1
(并且仅初始化了其中一个),或者代码中的某个地方th1
设置为null
。
使用调试器查看变量的值以及它们的更改时间。