安全的尝试/捕获java

时间:2013-08-07 18:22:09

标签: java try-catch

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结束吗?

5 个答案:

答案 0 :(得分:3)

是的,它在任何情况下都会调用(如果在你的情况下它不是null)。根据java docs

  

当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

如果您使用的是Java7,那么我强烈建议您使用try-with-resources Statement。然后您不需要在代码中编写 finally 块。

试用资源示例

     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进程在外部被杀死)。在所有其他情况下, finally 保证执行

答案 1 :(得分:0)

最后总是执行,即使抛出异常也是如此。因此,当bufferedReader.close();不为空

时,它将执行bufferedReader

答案 2 :(得分:0)

最后在try / catch块中意味着无论如何都会发生。 此外,异常将更好地声明为IOException。 在这种情况下,没有理由让catch块抛出异常。

注意:调用System.exit()确实会在遇到它时立即终止你的can,并导致应用程序被JVM(Java虚拟机)终止。

答案 3 :(得分:0)

我会推荐你​​这个问题:

In Java, is the "finally" block guaranteed to be called (in the main method)?

基本上,finally块总是会运行,但有一个例外:如果JVM在finally块执行之前退出。

关于bufferedReader是否正在执行 - 只要它不是null,是的,带有上述异常

答案 4 :(得分:0)

是的,此代码将在任何情况下关闭bufferedReader。但总的来说,代码看起来像一团糟。 Java 7 try-with-resources是关闭资源的最佳解决方案

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