有一个名为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为止,该线程才能启动,希望此信息足够。救命。谢谢

编辑:

线程th1global

th1总是首先被初始化,实际上该线程甚至开始运行,一直保持运行状态,直到f1的窗口激活事件为止。

最佳答案

Thread th1 =...创建一个新的局部变量,该局部变量将隐藏全局变量。

其他可能的原因:仅当用户必须先激活formWindow时,您的代码才有效。如果不是这种情况,则永远不会创建线程。

更好的解决方案是在加载屏幕可见的情况下创建表单f1,并在线程末尾禁用该表单。

如果不是这种情况,则可能有两个变量th1(并且仅初始化了其中一个),或者代码中的某个地方th1设置为null

使用调试器查看变量的值以及它们的更改时间。

08-16 22:29