Thread.isAlive()中的java.lang.NullPointerException

时间:2019-04-02 15:05:48

标签: java

有一个名为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仍在运行,我希望它显示负载屏幕上,暂时没有任何幻想。此加载框架称为“加载”。

所以,我写了这个:

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的窗口激活事件为止。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

对于那些必须知道的问题是,我已经全局初始化一次并且在windowActivated中初始化了两次线程 积分@ f1sh 该死,我不知道该如何记分,所以我只输入了一个'@'