2011-10-21 52 views
2

我這個簡單的代碼:爲什麼這個異常沒有被拋出?

@Override 
public Object call() throws Exception { 
    try (Connection conn = ConnectionPool.getConnection()) { 
     pageDAO = new PageDAO(conn); 
     linkDAO = new LinkDAO(conn); 
     loopInsertion(); 
    } 
    return true; 
} 

我在getConnection()方法得到一個SQLException。如果我放了一個catch,該塊中會捕獲異常,但是如果不是,Exception不會超前,但不會發生錯誤。顯示它已被鎖定,並且不繼續執行代碼。

爲什麼會這樣?我誤解了一些東西?這不是預料到的嗎?

回答

2

我猜測,你有沒有顯示的代碼,但如果這是a Callable您使用an ExecutorService調用,將可贖回代碼中發生的任何異常,直到你打電話one of the get()方法將不會傳播到任何地方the Future當您submitted the Callable時返回。當你調用get()時,它會拋出一個ExecutionException,它的根本原因是你的代碼拋出的異常。

簡而言之,當您使用ExecutorService將代碼分發到另一個線程時,從該代碼拋出的任何異常都會被捕獲並保留,直到您返回並詢問運行代碼的結果。如果你從不這樣做,那麼異常就會消失。

+0

是的,謝謝,我想是這樣,我刪除了'get()'方法。謝謝你的解釋。我不知道爲什麼,但我認爲只有得到的結果纔會隨之而來,並且隨時會給出解釋。現在我可以解決這個問題。 –

+0

@RenatoDinhaniConceição提出儘可能多的信息的好原因之一是: –

相關問題