2013-08-07 37 views
-2
try { 
     bufferedReader = new BufferedReader(new FileReader(new File(file,FILENAME))); 
     String readLine = bufferedReader.readLine(); 
     //do stuff 

    } catch(Exception e) { 
     throw e; 
    } finally { 
     if (bufferedReader!=null) 
      try { 
       bufferedReader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 
} 

將無論如何在這段代碼中調用bufferedReader關閉?安全try/catch java

+4

你試過調試它嗎? – Reimeus

+0

是的,是的,它會 – jsedano

+0

@Reimeus是的,但我不能相信,每一個可能的測試案例,所以我試圖讓從別人的答案有更好的體驗...... –

回答

3

是的,它調用在任何情況下(如果不是空的,你的情況下)。根據java的docs

的finally塊總是執行時的嘗試塊出口。這可確保即使發生意外異常也能執行finally塊。但是最後對於不僅僅是異常處理而言非常有用 - 它允許程序員避免由於返回,繼續或中斷而意外繞過清理代碼。清理代碼放在finally塊中總是一個很好的做法,即使沒有預期的例外情況。

如果您正在使用Java7那麼我強烈recommond使用try-with-resources Statement。然後你不需要寫在代碼中最後塊。

嘗試與 - 種源例如

 try (BufferedReader bufferedReader = 
      new BufferedReader(new FileReader(new File(file,FILENAME)));) { 
       String readLine = bufferedReader.readLine(); 
       //do stuff 
     } catch(Exception e) { 
      throw e; 
    } 

注: 最後塊將不執行只有一個案件。這就是當JVM關閉時(通常使用System.exit()語句或JVM進程在外部被終止)。在所有其他情況下,終於保證執行

+1

一個重要的注意事項 - 如果JVM在finally塊執行之前退出,那麼它將不會執行。即'System.exit()' – StormeHawke

+0

@stormeHawke是的,你是對的。這是唯一的一個case finally塊不會行爲。但這意味着JVM關閉,當JVM關閉時打開的資源將被關閉。 。? – Prabhaker

+0

@Prabhaker @Prabhaker也許會是,爲了完成的目的,將上面的註釋添加到答案... – jsedano

0

最後總是被執行,即使拋出異常與否。因此,它將執行bufferedReader.close();bufferedReader不爲空

+0

請注意,如果有事件調用System.exit(),或者進程在外部終止在到達塊之前,finally塊將不會執行。 – StormeHawke

0

終於在一個try/catch塊意味着它會發生,不管是什麼。 此外,異常會更好地聲明爲IOException。 在這種情況下,沒有理由讓catch塊引發異常。

注:這是事實調用System.exit()的將終止您能否儘快,因爲它遇到並會導致應用程序由JVM(Java虛擬機)被終止。

+0

請注意,如果有事件調用System.exit(),或者如果進程在塊到達之前被外部終止,finally塊將不會執行。 – StormeHawke

+1

@StormeHawke上面的答案已經改變,以反映你的評論,因爲這是真的。 –

0

是的,這個代碼將在任何情況下關閉BufferedReader中。但是總的來說,代碼看起來像一團糟。 Java 7試用資源是關閉資源的最佳解決方案

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(file,FILENAME))) { 
    //do stuff 
} 
+0

試用資源是一件好事。請注意,如果某個對象調用System.exit(),或者在該塊到達之前該進程在外部終止,finally塊將不會執行。 – StormeHawke