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

时间:2017-10-10 05:26:28

标签: java

以下是本书#34; Java All-in-one桌面参考"

的一个例子
df_stroke['Type'][<some index>]

}

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

我想知道return语句是否仍然会返回除法的结果?

======

我试图替换&#34; return c;&#34;使用&#34; System.out.println("Better clean up my mess.");&#34;,然后进行编译,结果如下:

System.out.println(c);

我无法相信变量Didn't work the first time. 0 Tried twice, still didn't work! 可以计算出来。 (但这是错误的数字)为什么会发生这种情况?

然后我也试图替换&#34; c&#34;用&#34; System.out.println("Better clean up my mess.");&#34;并且删除了finally块下面的语句,它再次被编译...由于finally块被执行,无论try块抛出任何异常还是被任何catch块捕获,返回c;应该执行。但结果如下:

  

第一次没有工作。

看起来return c;无法返回......

3 个答案:

答案 0 :(得分:2)

也不执行返回c。它直接进入主方法中的catch块。

答案 1 :(得分:1)

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

它会生成您在catch区块中所使用的相同类型的例外,但当时它不会被处理 - 您在中没有其他try-catch这个 catch阻止。

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

  

我想知道return语句是否仍然会返回除法的结果?

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

答案 2 :(得分:0)

  1. 如果执行该方法没有异常或错误,则返回一些值。
  2. finally块对return语句是否执行没有任何影响。 (当然,finally块不应该抛出任何进一步的异常)
  3. catch块确定是否应该进一步传播该异常或在该方法中处理该异常。
  4. 在给定的示例中,从ArithmeticException块抛出try,它将由相应的catch块处理。当catch块再次抛出相同的异常时,给定return语句永远不会执行。

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