2014-09-28 53 views
9

因此我在這裏有一些代碼,我不確定它在reader.close()方法拋出異常時如何反應。終於完全執行,如果在finally塊中拋出一個異常

public void someMethod(String s) throws IOException{ 
    BufferedReader reader = Files.newBufferedReader(filePath,cs); 
    listRWLock.readLock().lock(); 
    try{ 
    //miscellaneous code involving reading 
    }finally{ 
    reader.close() 
    listRWLock.readLock().unlock() 
    } 
} 

ListRWLock是一個ReentrantReadWriteLock。在reader.close()方法拋出異常的情況下,該語句執行失敗後會不會執行?我試過尋找這個主題,雖然我已經得到了有關在return語句中最終執行的內容,但是我沒有設法找到在finally語句塊中拋出異常時會發生什麼的細節。

在此先感謝。

+1

隨後的發言時間不得執行。而且,'finally'塊中的'return'可以覆蓋以前的異常。 – 2014-09-28 05:17:14

回答

4

基本上,最後條款是有保證的資源的適當釋放。但是,如果在finally塊內引發異常,則該保證消失。

一個沒有真正整潔解決方案的問題是,finally代碼塊中的代碼本身可能會引發異常。在這種情況下,finally塊中的異常將從異常中拋出,而不是在try塊內發生任何異常。由於finally塊中的代碼旨在「清理」的代碼,我們可以決定當作次要那裏發生異常,並把一個excplicit陷阱:

public int readNumber(File f) throws IOException, NumberFormatException { 
    BufferedReader br = new BufferedReader(new 
    InputStreamReader(new FileInputStream(f), "ASCII")); 
    try { 
    return Integer.parseInt(br.readLine()); 
    } finally { 
    try { br.close(); } catch (IOException e) { 
     // possibly log e 
    } 
    } 
} 

一些其他的事情終於要注意有關塊:

  1. ,我們有例外提及的相同「壓倒一切」的問題 從finally塊返回值時,會發生:這將 覆蓋任何返回值,在try塊中的代碼要 回報。在實踐中,從finally子句中返回一個值是罕見的,並且不推薦使用 。
  2. 實際上退出程序(通過調用System.exit()或由 造成使所述過程中止一個致命的錯誤:有時 稱爲非正式地稱爲「熱點」或「博士沃森」在Windows) 將阻止你的finally塊被執行!
  3. 沒有什麼可以阻止我們嵌套try/catch/finally塊(例如,對於 示例,將try/finally塊放在try/catch塊內,反之亦然),並且這種做法並不罕見。
+0

你已經直接複製並從[這裏](http://www.javamex.com/tutorials/exceptions/exceptions_finally.shtml)和[這裏](http://softwareengineering.stackexchange.com/a/ 188877/114810)?從他們每個人一句話!有禮貌至少給他們信用! – 2017-02-22 19:05:49

1

你應該對此進行測試,

但如果嘗試拋出IO異常,那麼你的讀者不會關閉。

也許有

catch(IOException ex){ 
     reader.close() 
+0

不正確,並且不回答問題。 – EJP 2014-09-28 23:12:31

1

的異常可以在你的代碼的任何地方發生,包括finally塊,所以你必須要爲其他地方趕在你的代碼。檢查下面的帖子,以獲取有關您可以處理這種情況的方法的一些想法:

throws Exception in finally blocks

+0

不回答問題。 – EJP 2014-09-28 23:13:29

4

你可以做這樣的事情:

try{ 
    //miscellaneous code involving reading 
}finally{ 
    handlePossibleException(reader); 
    listRWLock.readLock().unlock() 
} 

handlePossibleException(BufferedReader reader) { 
    try { 
     if (reader != null) { 
      reader.close(); 
     } 
    } catch(Exception e) { 
     log.e("reader.close() Exception: ", e); 
     } 
} 
相關問題