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

Luc*_*uca 2 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;  
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

bow*_*ore 5

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

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