一、try-finally語句的基本使用
try { // 可能會拋出異常的代碼塊 } finally { // 無論是否拋出異常都會執行的代碼塊 }
在Java中,我們常常需要進行一些清理工作,例如關閉I/O流、釋放數據庫連接、解除鎖定等操作。try-finally語句就是用來實現這一目的的。無論try塊中是否引發了異常,finally中的代碼塊總是會被執行,這通常用於釋放資源。
假如我們希望在方法返回前關閉一個I/O流,try-finally語句就可以這樣使用:
public static void readFile(String fileName) throws IOException { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
無論try塊代碼是否拋出IOException,finally中的close()方法總是會被執行,來保證reader資源得到關閉。
二、try-catch-finally語句的使用
try { // 可能會拋出異常的代碼塊 } catch (Exception e) { // 異常處理代碼塊 } finally { // 無論是否拋出異常都會執行的代碼塊 }
try-catch-finally語句是Java中處理異常的標準方式,catch塊用於處理可能會拋出的異常,finally塊用於清理資源。如果finally塊中也拋出了異常,那麼它會覆蓋前面的異常,成為最後的拋出異常。
下面是一個簡單的例子展示try-catch-finally的使用:
public static void readFile(String fileName) { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
如果在讀取文件過程中拋出了IOException,控制權會跳到catch塊中進行異常處理,接着finally塊中的close()方法會被調用,來保證reader資源得到關閉。
三、try-catch-finally語句的嵌套使用
try { try { // 可能會拋出異常的代碼塊1 } catch (Exception e1) { // 異常處理代碼塊1 } finally { // 無論是否拋出異常都會執行的代碼塊1 } } catch (Exception e2) { // 異常處理代碼塊2 } finally { // 無論是否拋出異常都會執行的代碼塊2 }
try-catch-finally語句可以進行嵌套使用,內層的異常處理會覆蓋外層的異常處理。當然,內層finally塊的代碼總是會被優先執行,因為內層finally塊在外層finally塊之上。
下面是一個簡單的例子展示try-catch-finally的嵌套使用:
public static void readFile(String fileName) { BufferedReader reader = null; try { try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e1) { e1.printStackTrace(); } finally { if (reader != null) { reader.close(); } } } catch (IOException e2) { e2.printStackTrace(); } }
頂層的try-catch語句用於拋出readFile()方法中發生的IOException異常,內部的try-catch-finally語句用於讀取文件。當文件讀取出現問題時,頂層的IOException異常會被拋出並進行處理,而內部的異常處理代碼塊會被忽略,但內部的finally塊仍然會被優先執行,以保證reader資源的釋放。
四、finally塊的使用注意事項
finally塊雖然是無論是否拋出異常總會執行的代碼塊,但是在特定情況下,finally塊中的代碼也有可能不會被執行。下面是一些finally塊使用注意事項:
- 如果在try塊或catch塊中調用了System.exit(),那麼finally塊將不會執行。
- 如果在try塊中存在一個無限循環或者死循環,那麼finally塊將不會執行。
- 如果在try塊中使用了return語句,那麼finally塊中的語句會在方法返回之前被執行。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/241598.html