2014-03-02 132 views
1

我需要拋出異常。唯一的問題是異常是從方法中啓動的線程拋出的。如何從線程拋出異常?

這裏是我的意思的例子:

public void connectToWebsite(String URL){ 
    new Thread(){ 
     @Override 
     public void run(){ 
      openURLConnection(URL);//Throws Malformed URL and IO Exception 
     } 
    }; 
} 

這是一個API的一部分,所以我想,讓API的用戶處理異常,他們怎麼會這樣選擇。但是,我不能讓connectToWebsite(url)拋出異常,因爲異常在運行中被拋出。我不能得到run()拋出異常,因爲它不會覆蓋運行方法。有沒有一種方法可以在不構建整個新線程類的情況下拋出異常?或者,我是否應該加入與printStackTrace s的捕獲?

我理想上喜歡connectToWebsite拋出異常並讓用戶處理它。但是,這甚至有可能嗎?如果是這樣,怎麼樣?如果我不能或不應該拋出異常,我應該如何通知用戶出了什麼問題?

+0

你寫了哪個API來聲明拋出異常,在方法中使用 – 2014-03-02 20:13:52

+1

你看到了嗎? http://stackoverflow.com/questions/4491606/java-thread-run-method-cannot-throw-checked-exception –

+1

http://book.javanb.com/java-threads-3rd/jthreads3-CHP-13- SECT-5.html剛剛發現。看看它。未捕獲的異常通過可以重寫的方法處理。發生異常的線程作爲參數傳遞給此處理程序。 – 2014-03-02 20:15:13

回答

5

有沒有一種方法,我可以得到的異常拋出,而不建立一個完整的新的線程類?或者我應該解決在printStackTraces上添加catch的問題?

有幾件事你可以做。最好的是可以轉而使用ExecutorService並使用Callable而不是可運行的。您可以將您的Callable提交給ExecutorService,它返回Future。當您撥打future.get()時,如果您的call()方法引發異常,它將引發異常。它實際上會拋出ExecutionException,並且該異常的原因將是call()拋出的異常。

您也可以使用UncaughtExceptionHandler並將其設置爲Thread。然後,如果你拋出線程,處理程序將被調用,例外。

0

Runnable不能拋出異常或返回值。

可以做的一件事是讓由openURLConnection創建的對象爲null。因此,用戶將檢查

if (object == null) { /* something went wrong with url connection */ } 
else { 
/* all ok */ 
} 

並知道是否出現問題或不。

這取決於您的API如何工作。