2013-03-08 75 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块来清理可能会占用资源的任何状态,但在捕获父例程中的异常而不是抛出异常的子例程时,通常会更好。一般来说,如果在调用例程中知道子例程是否成功,那么该子例程不应该捕获它的异常,而应该允许它们冒泡到它们的调用者。