2013-03-08 55 views
4

這將被認爲是更合適的技術來實現Java中的try/catch語句:正確的嘗試捕捉設計

答:

Date lastMod = null; 
BufferedReader inFile = null; 
    try { 
     inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini")); 
     try { 
      lastMod = new Date(Long.parseLong(inFile.readLine())); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } catch(FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

或B:

Date lastMod = null; 
BufferedReader inFile = null; 
    try { 
     inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini")); 
     lastMod = new Date(Long.parseLong(inFile.readLine())); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

此外,有使用BufferedReader的一長段代碼跟隨try/catch塊是錯誤的,還是傾向於在try/catch中包含很長的代碼塊?

例如:

public static void main(String[] args) { 
    Date lastMod = null; 
    BufferedReader inFile = null; 
    try { 
     inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini")); 
     lastMod = new Date(Long.parseLong(inFile.readLine())); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    //Long block of code using inFile 
    inFile.readLine(); 
    inFile.close(); 

對戰:

public static void main(String[] args) { 
    Date lastMod = null; 
    BufferedReader inFile = null; 
    try { 
     inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini")); 
     lastMod = new Date(Long.parseLong(inFile.readLine())); 
     //Long block of code using inFile 
     inFile.readLine(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     inFile.close(); 
    } 
+3

B.它更簡潔可讀.... – Thihara 2013-03-08 04:21:49

+2

你有沒有聽說過或嘗試過「試用資源」? – Abubakkar 2013-03-08 04:23:34

+0

兩種情況下,選項'B'! – SudoRahul 2013-03-08 04:23:51

回答

1

B是更可讀,當沒有任何內部try塊後在進行,外部try塊之前。如果你有邏輯執行之間,那麼你必須使用A

在第二個例子中,使用finally的第二個版本對於確保無論什麼(即使該函數返回第一個)都會被調用至關重要。第一個版本沒有最後實際上是錯誤的,因爲你可能會用完所有的文件句柄,無法打開更多的文件。

作爲附加說明,您可能需要在調用close時檢查null。如果您使用的是Java 7,那麼使用"try with resources"更好。

1

對於第一個問題:解決方案A增加了不必要的複雜性。採用B或者,如果你正在使用Java 7,嘗試與 - 資源:

Date lastMod = null; 
    try (BufferedReader inFile = new BufferedReader(new FileReader("C:\\Java\\settings.ini"))){ 
     lastMod = new Date(Long.parseLong(inFile.readLine())); 
    } catch (FileNotFoundException | IOException e) { 
     e.printStackTrace(); 
    } 

對於第二個問題:在第一個版本,如果BufferedReader創建拋出一個異常呢?你會使用br之後爲空,並會拋出一個NullPointerException。此外,如果發生其他事情,您將不會撥打inFile.close(),因此您確實需要finally。出於所有這些原因,第二種解決方案再一次更好。

如果您使用try-with-resouces(Java 7),當然,您不需要終止塊來釋放您的BufferedReader。

+0

感謝您的答案。我沒有聽說過試用資源,但我會做一些閱讀。 – korshyadoo 2013-03-08 04:32:31

0

正確的技巧可能還包括不捕捉你的異常,而是允許它們冒泡給調用者。請務必使用finally塊來清理可能會佔用資源的任何狀態,但在捕獲父例程中的異常而不是拋出異常的子例程時,通常會更好。一般來說,如果在調用例程中知道子例程是否成功,那麼該子例程不應該捕獲它的異常,而應該允許它們冒泡到它們的調用者。