为了账号安全,请及时绑定邮箱和手机立即绑定

尝试捕获最终返回的澄清

尝试捕获最终返回的澄清

慕森王 2019-11-26 12:59:12
通过阅读本论坛中与上述主题相关的所有问题(请参见标题),我完全理解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不传递回控制到程序但返回值,并结束方法。我们可以这样说吗?
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

如果到达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。


查看完整回答
反对 回复 2019-11-26
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

这是一些显示其工作原理的代码。


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"; 

        }

    }

}

结果是:


try

catch

finally

return in finally


查看完整回答
反对 回复 2019-11-26
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 388 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信