try-catch-finally和其余的方法执行顺序

时间:2015-04-02 15:40:11

标签: java exception

我对使用try / catch / finally子句有疑问,让我解释一下: 我知道在声明中声明异常规范的每个方法都必须用try块包围(在调用方法中),然后是一个可以捕获该异常的catch块(除非我没有声明调用方法抛出一个例外)。如果调用方法在try-catch之后有其他语句,那么无论发生什么(抛出或不抛出异常)都会执行这些语句。如果我有以下代码:

 public class ExceptionCall {
   Throwing t = new Throwing();
    public void methodTry(){
        while(true){
            try {
                if (t.flag++==0)
                    t.throwing();
                System.out.println("no exception");
            } 
            catch (MyException e) {
                e.printStackTrace(System.err);
                System.out.println("working on it!");
            }
            finally{
                System.out.println("finally clause");
            }
                System.out.println("out");
                if (t.flag==2) 
                    break;  
        }
    }
}

这里Throwing有一个名为(guess what :))throw()的方法,它被声明为抛出一个MyException exception,并且有一个名为flag的公共字段,其中包含一个初始化为0的int,以提供一个条件检查。

因此,无论try块中发生什么,都会执行几次保护区域外的代码。

所以我的问题是,最后一块是什么?我的意思是,我知道当调用方法从try或catch块返回时它会派上用场(在这种情况下我可以在catch中有一个break语句并且finally会被执行),但在这种情况下,这是什么差Δφ

2 个答案:

答案 0 :(得分:5)

  

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

请参阅:https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

答案 1 :(得分:3)

最后块用于处理那些需要您在语句末尾执行某些操作的资源,无论代码中发生什么。

例如:读者或流是在使用后必须关闭的资源,但在使用期间可能会发生异常,因此关闭它们的地方???

这里finally子句变得非常方便:

FileReader reader;

try {
  reader = new FileReader("someNonExistingFile");
} catch (FileNotFoundException e) {
   // handle FileNotFoundException
   e.printMessage();
} finally {
   // reader MUST BE CLOSED ALWAYS, so FINALLY, CLOSE IT
   reader.close();
}

在此示例中,您需要始终关闭阅读器(如果文件存在且文件不存在),那么您使用{{而不是关闭它两次(在trycatch中) 1}}。

最后here的更多信息和示例。另请检查try with resources(Java 7 +)。