2011-04-30 79 views
0

我需要捕獲線程運行時發生的線程異常。
我試圖拋出新的異常,但它顯示錯誤,「未報告的異常......必須被捕獲或聲明拋出」.2 如果不可能,那麼爲什麼? 如果你能解釋原因。Catch異常線程外側

這裏是我的代碼

try { 


      log("Connecting to Module.."); 
      int no = searchdevices.getSelectedIndex(); 
      String Selectaddress = searchdevices.getString(no); 
      String name = Selectaddress.substring(0, 6); 
      String add = Selectaddress.substring(Selectaddress.indexOf("$") + 1); 
      if (no == -1) { 
       Alert al = new Alert("Warning", "" + no, null, AlertType.WARNING); 
       al.setTimeout(3000); 
       display.setCurrent(al); 
      } 
      final String fdata2 = "btspp://" + add + ":1;master=false;encrypt=false;authenticate=false"; 
      finalurl = fdata2; 
      fbtname = name; 
      // fbtadd = add; 
      new Thread(new Runnable() { 

       public void run() { 
        try { 

         isConnOpen = true; 
         stream = (StreamConnection) Connector.open(fdata2); 
         in = stream.openInputStream(); 
         out = stream.openOutputStream(); 
         url2 = fdata2; 

         GoTo_Success(); 

        } catch (IOException ex) { 

         throw new Exception();//in side exception 
        } 
       } 
      }).start(); 
     } catch (Exception e) { 
      log("Please switch on bluetooth and then try again"); // want to catch here.. 
     } 

謝謝。

+0

向我們展示您的代碼,您試圖拋出異常。 – 2011-04-30 05:48:23

+0

我已經把代碼。 – Nirav 2011-04-30 05:53:48

回答

1

?一旦你調用start(),線程就會啓動(當然,在那次調用之後的某個時刻),程序的其餘部分會繼續執行。

例如說,創建線程並使用名爲「foo」的方法啓動線程。一旦你開始了,foo方法就會結束並返回到任何調用它的地方。然後,這稱爲一個方法「酒吧」。在那個時候,新的線程實際上是預定運行的,所以「bar」方法被掛起,線程中的run方法被執行。現在發生異常。該計劃距離你想要發生的事情還有很遠的距離。即使這不是該計劃的一部分是睡着了。

+0

是的,你說得對。我們無法處理過去,只有我們可以處理當前或未來。我對嗎? – Nirav 2011-04-30 06:11:31

+0

查看java.util.concurrent包(http://download.oracle.com/javase/tutorial/essential/concurrency/executors.html)。我想你可以說當前/未來的一點。 – TofuBeer 2011-04-30 06:30:32

1

當你在catch中拋出一個新的異常時,你必須用try..catch來處理它。

試試這個:

new Thread(new Runnable() { 

      public void run() { 
       try { 

        isConnOpen = true; 
        stream = (StreamConnection) Connector.open(fdata2); 
        in = stream.openInputStream(); 
        out = stream.openOutputStream(); 
        url2 = fdata2; 

        GoTo_Success(); 

       } catch (IOException ex) { 

        try { 
        throw new Exception(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       }//in side exception 
       } 
      } 
     }).start(); 
+0

是的,但在行「})。start();」下方有另一個catch,我想在那裏捕獲異常。我在評論中提到過。 – Nirav 2011-04-30 06:01:38

+0

@Nirav:你可能無法獲得它,因爲你正在做的是創建一個新的Runnable類,並在其內部重寫方法運行。因此,所有的例外應該只在該類中處理。 – 2011-04-30 06:04:42

+0

是的。我明白了。感謝您的回覆。 – Nirav 2011-04-30 06:13:13

0

的異常必須在方法聲明中使用throws子句中聲明,只有這樣,你可以使用throw new Exception();

如果你看到Thread.run(),那麼你會發現,沒有throws Exception條款。因此你會得到一個編譯錯誤。

請參見以下鏈接:嗯給出一個線程在你的代碼運行時,它如何能捕捉到了異常,同時運行

  1. http://pages.cs.wisc.edu/~cs368-1/JavaTutorial/NOTES/Exceptions.html
  2. http://download.oracle.com/javase/tutorial/essential/exceptions/
0

如果您想要在另一個線程中收到關於異常的通知,您必須手動傳輸異常。

一個例子是使用Queue<Exception>或類似的東西,你的工作線程會捕獲任何異常並將其添加到隊列中。

「主線程」(或特殊的異常處理程序線程或UI線程,或...)會定期輪詢隊列以查看是否有新的異常,如果是,它可以顯示它給用戶。