麻烦关闭一个线程

时间:2013-05-11 13:34:23

标签: java multithreading nullpointerexception

当我尝试停止正在运行的线程时,我似乎无法弄清楚为什么我会得到一个空指针异常。 ftprun.requestStop()设置while循环的值,以便应用程序停止。

public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        JButton btn = (JButton) e.getSource();
        Thread ftpthread= null;
        LocalFTP ftprun = null;

        switch (e.getActionCommand()) {
        case "Start Sorter":
            if(ftp) {
                JOptionPane.showMessageDialog(frame, "Sorter and ftp cannot run at the same time");
            } else {
                sorter=true;
                btn.setText("Stop Sorter");
                btn.setBackground(SystemColor.green);
            }
            break;
        case "Start ftp":
            if(sorter) {
                JOptionPane.showMessageDialog(frame, "Sorter and ftp cannot run at the same time");
            } else {
                ftp=true;
                btn.setText("Stop ftp");
                btn.setBackground(SystemColor.green);
                Config config = new Config();
                try {
                    File cf= new File(Configfile.configfile);
                    if (cf.exists()) {
                        config=ConfigurationTools.openconfig(Configfile.configfile);
                    }
                    else {
                        ConfigurationTools.writeconfig(Configfile.configfile, config);
                    }
                } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }

                ftprun= new LocalFTP(config,config.getlocalftpinterval());

                ftpthread=new Thread (ftprun);

                ftpthread.start();

            }
            break;
        case "Start Uploader":
            uploader=true;
            btn.setText("Stop Uploader");
            btn.setBackground(SystemColor.green);
            break;  
        case "Stop Sorter":
            sorter=false;
            btn.setText("Start Sorter");
            btn.setBackground(SystemColor.menu);
            break;
        case "Stop ftp":
            ftp=false;
            btn.setText("Start ftp");
            btn.setBackground(SystemColor.menu);
            ftprun.requestStop();
            break;
        case "Stop Uploader":
            uploader=false;
            btn.setText("Start Uploader");
            btn.setBackground(SystemColor.menu);
            break;  

        }
    }

任何建议。我试图将Thread和runnable变量设置为static,但我得到了一个错误。

2 个答案:

答案 0 :(得分:7)

这是问题所在:

LocalFTP ftprun = null;

switch(...) {
    case ...:
        ...
        ftprun = new LocalFTP(...); 
        ...
        break;
    case ...:
        ...
        ftprun.requestStop();
        ...
        break;   
}

这是本地变量。它只是在不同的case块中被设置为非null值,所以在你调用requestStop的情况下它不可能是非null的。它只会在actionPerformed方法的不同调用中发生,并带有一个单独的局部变量(将为null)。

听起来这实际上是整个对象状态的一部分 - 所以你应该把它作为对象中的一个实例字段,而不是局部变量。

答案 1 :(得分:4)

ftprunactionPerformed()方法的局部变量。因此,当您启动一个线程时,它会被初始化,然后超出范围。

单击停止按钮后,将再次调用actionPerformed()方法,并将其ftprun局部变量重新初始化为null。此变量应该是实例字段,而不是局部变量。