2013-06-03 83 views
3

我創建了以下FutureTask方法以異步方式運行方法。Java FutureTask異常

public FutureTask<Object> SendAggregateEventAsync(final 
     com.Company.Product.SDK.Device.AggregateEvent.ClassObject 
     request) 
{ 
    FutureTask<Object> futureTask; 

    futureTask = new FutureTask<Object>(new Runnable() { 
     public void run() 
     { 
      try { 
       SendAggregateEvent(request); 
      } catch (ResponseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }, null); 

    return futureTask; 
} 

public void SendAggregateEvent(
     com.Company.Product.SDK.Device.AggregateEvent.ClassObject 
     request) throws ResponseException 
{ 
    try 
    { 
     if(request == null) throw new IllegalArgumentException("request"); 

     String[] s_array = new String[0]; 
     s_array[0] = "EventTime"; 

     String namespace = "http://Product.Company.com/" + 
       "v1.0/Device/AggregateEvent"; 

     IBindingFactory factory; 

     factory = BindingDirectory.getFactory(
       com.Compant.Product.SDK.Device.AggregateEvent. 
       ClassObject.class); 

     String message = ChangeDatesToUTC(MessageHelper. 
       SerializeObject(factory, request), s_array, namespace); 

     SendMessage(message); 

    } catch (JiBXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

爲了編譯我必須趕在FutureTask的ResponseException,但至關重要的是,這ResponseException拋出的實現應用程序,而不是由FutureTask抓住。有沒有辦法解決這個問題,我可以從FutureTask中拋出這個異常?

+0

這個問題是重複的。 [這裏是原創](http://stackoverflow.com/questions/3555302/how-to-catch-exceptions-in-futuretask)。 –

+1

Java命名約定:方法名應該是'camelCase'。方法名中的第一個字母不能是大寫字母。雖然.NET語言這樣做,但Java對此不以爲然。 – fge

回答

5

Pass a Callable的構造函數,而不是通過一個Runnable,而且你不會有捕獲異常了:

futureTask = new FutureTask<Object>(new Callable() { 
    public Object call() throws ResponseException { 
     SendAggregateEvent(request); 
     return null; 
    } 
}; 

(但一般類型的FutureTask應該是Void,而不是Object)。

如果ResponseException被拋出call(),FutureTask的get()方法將拋出一個ExecutionException,並且此異常的原因將是ResponseException。

也就是說,不應該簡單地將Callable提交給ExecutorService,並讓它爲您創建Future?也嘗試尊重Java命名約定,並從方法中移除throws子句,因爲它不會拋出任何異常。命名也很糟糕:您的方法不會發送任何內容。它只創建一個FutureTask,它在執行時會發送一個事件。

+1

不幸的是,這些方法的命名約定並不是我自己選擇的,我必須遵循給出的指示。我刪除了throws子句,但是我無法從Runnable轉換爲Callable。我想避免爲我想異步執行的方法調用創建另一個類,有沒有辦法做到這一點。 – JME

+0

請參閱我編輯的答案以瞭解如何創建Callable。我不明白你評論最後部分的含義。你必須在某個地方執行這個任務,否則,創建它不起任何作用。 –

+1

@JBNizet這是答案,也許應該提到的進一步澄清,檢查「FutureTask」拋出的異常被包裝到聲明的「ExecutionException」中(並且通過後一個異常的'.getCause() )。 – fge