【问题标题】:try-catch-finally and rest of the method order of executiontry-catch-finally 和其余方法的执行顺序
【发布时间】:2015-04-02 15:40:11
【问题描述】:

我对使用 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 有一个名为 (猜猜看 :) ) throwing() 的方法,该方法被声明为抛出一个 MyException exception,并且有一个名为 flag 的公共字段,其中包含一个初始化为 0 的 int,以提供一种条件检查.

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

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

【问题讨论】:

  • 由于你的 catch 不会让你脱离你的循环甚至你的方法(没有returnbreak,而不是重新抛出),所以这里真的不需要 finally。 finally 的一种用法可能是清理您在 try 中所做的事情,否则这些事情会泄漏或留给 GC。

标签: java exception


【解决方案1】:

finally 块总是在 try 块退出时执行。这可以确保即使发生意外异常也会执行 finally 块。但 finally 不仅仅对异常处理有用——它允许程序员避免清理代码意外地被 return、continue 或 break 绕过。将清理代码放在 finally 块中始终是一种很好的做法,即使没有预料到异常也是如此。

见:https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

【讨论】:

    【解决方案2】:

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

    例如:readers或者streams是使用后必须关闭的资源,但是在使用过程中可能会发生异常,那么你在哪里关闭呢???

    这就是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 中),而是使用 finally

    finally here 的更多信息和示例。还要检查try with resources (Java 7+)。

    【讨论】:

    • 你的代码不起作用,阅读器在try块的范围内,在finally中看不到。此外,它无法在 try 中初始化,因为编译器不允许我关闭它(它一开始就无法打开)。在这种情况下,我可以在 finally 之外编写清理代码,它会以同样的方式执行,不是吗?
    • 抱歉,已修改...这是即时编写的 wexample!但你明白了吗??
    • 是的,我明白了..但是外面的代码最终不会被执行吗? (在这种情况下)
    • 在这个简单的情况下是的,但是有很多场景:即:发生异常时执行中断,一些引用变为空并且候选 GC....在我分享的链接中你会发现很多Lars Vogel 的案例,更好的 Java 教程制作者之一
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2013-12-30
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多