2013-05-14 30 views
1

我只是想調用java中的線程。我想檢查線程是否中斷。該線程在「Scheduler」類中定義。下面的代碼:Java中的線程獲取NullPointerException

 if (flag == true) 
     { 
     thread = new Scheduler(); 
     thread.start(); 
     } 

     else 
     { 
     thread.interrupt(); 
     } 

     public void run() 
     { 
      while (thread.isInterrupted() != true) // Here i get a NPE... 
      { 
      //.... 
      } 
     } 
+3

請提供更大的代碼段。這是不明確的地方'線程'定義等 – AlexR 2013-05-14 12:33:09

+0

一個完整的異常堆棧跟蹤和更多的代碼將是有用的。 – happymeal 2013-05-14 12:37:27

+2

請停止編寫'(booleanCondition!= true)'。每當你這樣做,一隻小貓咪就會哭泣。 – MikeTheLiar 2013-05-14 12:53:34

回答

0

是從調度的run()的代碼片段?在運行中,爲什麼你有thread.isInterrupted()?改用

Thread.currentThread().isInterrupted() 

也將是很好看的構造以及其中線程變量聲明

+1

謝謝你,那是原因 – dogano 2013-05-14 19:36:11

1

你所得到的NullPointerException的原因可能是因爲該變量未初始化,由於flag是在if聲明假的,但我不認爲是的根問題在這裏。

如果你想檢查是否被調用線程被中斷,你應該使用

while (!this.isInterrupted()) { 

在你的代碼片段,它看起來像你,而不是測試的另一個Scheduler對象。

1

首先,由於標誌是一個布爾值,你可以簡單的寫:

if (flag) 
    { 
     thread = new Scheduler(); 
     thread.start(); 
    } 

else 
    { 
     thread.interrupt(); 
    } 

我相信你的問題是,標誌計算結果爲假,你最終空對象上調用isInterrupted()。這也很有可能是你指的是完全不同的線索,而不是你認爲的那樣。目前還不清楚你指的是哪個對象 - 你需要發佈更多的代碼。

另外:

while (!thread.isInterrupted()) // isInterrupted() returns a boolean, you don't need != true 
    { 
      //.... 
    } 
+0

如果flag爲'false',那麼在調用'thread.interrupt();'時應該是NPE。而且在這種情況下,線程不會被創建,因此它的'run()'方法不會被執行。 – AlexR 2013-05-14 12:55:39

+0

是的,我也很困惑。我的假設是,他還沒有測試過那部分代碼,或者在我們沒有的代碼的某個地方是'if(!flag)'初始化線程的東西。 – 2013-05-14 13:00:03

相關問題