尝试捕获最终返回的澄清

通过阅读本论坛中与上述主题相关的所有问题(请参见标题),我完全理解finally总是会调用该问题。(System.exit和无限循环除外)。但是,我想知道是否return在catch块中调用了a,然后return从finally块中调用了另一个。


例如:


public static void main(String[]args) {

    int a = new TestClass().absorbeTheValue();

}


int absorbeTheValue() {

    try {

        int a = 10/0;

        if (a > 0) return 4;

    } catch(Exception e) {

        return 45;

    } finally {

        return 34;

    }

}    

因此,无论如何,这里的输出(调用该方法时)将为34。这意味着最终总会运行。我认为尽管其他“返回”根本没有执行。在许多帖子中,我发现一个事实,那就是最终将内容覆盖在catch子句return已经编写的内容之上。我的理解是,一旦将要对catch子句中的返回值进行评估,控制流便会传递到finally子句,该子句又具有另一个返回值,这次将对返回值进行评估,而不会将控制权传递回catch子句。这样,return在运行时唯一调用的将是final返回。你同意吗?


甲return在finally不传递回控制到程序但返回值,并结束方法。我们可以这样说吗?


慕森王
浏览 389回答 3
3回答

尚方宝剑之说

如果到达return了该try块中的in ,它将控制权转移到该finally块,该函数最终将正常返回(不是抛出)。如果发生异常,但是代码return从该catch块到达a ,则控制权转移到该finally块,并且该函数最终正常返回(不是抛出)。在你的榜样,你有return在finally,所以不管发生什么情况,该函数将返回34,因为finally有最后的(如果你愿意)字。尽管您的示例中未涉及,但即使您没有,catch并且如果在try块中引发了异常且未捕获到异常,这也将是正确的。通过return从finally块执行a ,可以完全抑制异常。考虑:public class FinallyReturn {  public static final void main(String[] args) {    System.out.println(foo(args));  }  private static int foo(String[] args) {    try {      int n = Integer.parseInt(args[0]);      return n;    }    finally {      return 42;    }  }}如果您在不提供任何参数的情况下运行它:$ java最终返回...中的代码foo引发ArrayIndexOutOfBoundsException。但是因为该finally块执行a return,所以该异常得到抑制。这就是为什么最好避免使用returnin的原因之一finally。

海绵宝宝撒

这是一些显示其工作原理的代码。class Test{    public static void main(String args[])     {         System.out.println(Test.test());     }    public static String test()    {        try {            System.out.println("try");            throw new Exception();        } catch(Exception e) {            System.out.println("catch");            return "return";         } finally {              System.out.println("finally");            return "return in finally";         }    }}结果是:trycatchfinallyreturn in finally

慕姐8265434

一个块中的returna catch将“正常”完成,而不是“突然”完成。从第11节中可以很明显地看出这一点:“在引发异常的过程中,Java虚拟机突然一个一个地完成了所有已经开始但尚未完成的表达式,语句,方法和构造函数调用,初始化程序以及字段初始化表达式。在当前线程中执行。”
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java