繁体   English   中英

在java中的finally块后,return语句如何工作?

[英]How does a return statement work after a finally block in java?

这是“Java All-in-one桌面参考”一书中的一个例子

public class CrazyWithZeros {
public static void main(String[] args) {
    try {
        int answer = divideTheseNumbers(5, 0);
    } catch (Exception e) {
        System.out.println("Tried twice, still didn't work!");
    }
}

public static int divideTheseNumbers(int a, int b) throws Exception {

    int c;
    try {
        c = a / b;
        System.out.println("It worked!");
    } catch (Exception e) {
        System.out.println("Didn't work the first time.");
        c = a / b;
        System.out.println("It worked the second time!");
    } finally {
        System.out.println("Better clean up my mess.");
    }
    System.out.println("It worked after all.");
    return c;

}

}

执行finally子句后,ArithmeticException将被抛回到调用方法。 语句System.out.println("It worked after all."); 在这种情况下永远不会被执行。 但是return c;发生了什么return c;

我想知道返回陈述是否仍会返回分裂的结果?

========

我试图替换“ System.out.println("Better clean up my mess."); ”with“ System.out.println(c); ”,然后它被编译,结果如下:

 Didn't work the first time. 0 Tried twice, still didn't work! 

我无法相信变量c可以计算出来。 (但这是错误的数字)为什么会发生这种情况?

然后我也尝试替换“ System.out.println("Better clean up my mess."); ”with“ return c; ”并删除finally块下面的语句,再次编译...由于finally块是执行是否由try块抛出任何异常或由任何catch块捕获,返回c; 应该执行。 但结果如下:

第一次没工作。

看起来像c无法返回...

也不执行return c。 它直接进入main方法中的catch块。

您希望第二次执行容易出错的操作是什么? :)

它会生成一个与catch块中相同类型的异常,但是当时它不会被处理 - 你在这个 catch块中没有另一个try-catch

无论是否发生异常或正常的流程进行,都始终执行finally 在你的情况下,你来到带有异常的finally块并将它抛给调用者( main ),在那里它由自己的catch块处理。

我想知道返回陈述是否仍会返回分裂的结果?

你想要什么回报? 您尚未初始化变量c并且此变量没有正确的记录。 因此,Java不允许在c写入“意外或不可预测的东西”。

  1. 如果执行没有异常或错误,则方法返回一些值。
  2. finally块对return语句是否执行没有任何影响。 (当然, finally块不应该抛出任何进一步的异常)
  3. catch块确定是否应该进一步传播该异常或在该方法中处理该异常。

在给定的示例中,从try块抛出ArithmeticException ,它将由相应的catch块处理。 由于catch块再次抛出相同的异常,因此return语句永远不会执行。

简而言之, return c; 永远不会在上面的程序中执行,变量c将被删除为任何其他局部变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM