2013-05-11 119 views
0

我似乎無法弄清楚爲什麼當我試圖阻止正在運行的線程時出現空指針異常。 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; 

     } 
    } 

有什麼建議。我試圖設置線程和可運行的變量爲靜態,但我剛剛得到一個錯誤。

+4

如果你會說你在哪裏得到異常,這將有所幫助。如果你想出一個簡短但完整的例子來說明這個問題,那也是非常有用的。 – 2013-05-11 13:35:27

+0

棧跟蹤.... – m0skit0 2013-05-11 13:38:25

+0

就像我說的,當試圖停止使用ftprun.requestStop()完成的線程時,我得到空指針異常。我會在問題中提到這一點。 – Codeguy007 2013-05-11 15:06:55

回答

7

這就是問題所在:

LocalFTP ftprun = null; 

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

這是一個本地變量。它只被設置爲不同大小寫塊中的非空值,因此在調用requestStop的情況下,它無法爲非空值。它只會在您的actionPerformed方法的不同調用中發生,並帶有一個單獨的局部變量(它將爲空)。

聽起來這是真正的整體對象狀態的一部分 - 所以你應該把它作爲你的對象中的一個實例字段,而不是局部變量。

+0

所以你說我需要將變量移出actionPerformed()並將它們作爲對象的一部分啓動。謝謝你的工作。 – Codeguy007 2013-05-11 15:27:42

+1

@ Codeguy007:好。你明白*爲什麼*它的工作原理?理解「當前執行的操作」在邏輯上是對象狀態的一部分很重要 - 狀態需要存儲在字段而不是實例變量中。 – 2013-05-11 15:29:21

4

ftprunactionPerformed()方法的局部變量。所以它在你啓動一個線程時被初始化,然後超出範圍。

單擊停止按鈕後,會再次調用actionPerformed()方法,並將其ftprun局部變量重新初始化爲空。這個變量應該是一個實例字段,而不是局部變量。