以下是本书#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;
无法返回......
答案 0 :(得分:2)
也不执行返回c。它直接进入主方法中的catch块。
答案 1 :(得分:1)
您希望第二次执行容易出错的操作是什么? :)
它会生成您在catch
区块中所使用的相同类型的例外,但当时它不会被处理 - 您在中没有其他try-catch
这个 catch
阻止。
无论发生异常还是正常的流程进行,都始终执行finally
。在您的情况下,您来到带有异常的finally
块并将其抛给调用者(main
),在那里它由自己的catch
块处理。
我想知道return语句是否仍然会返回除法的结果?
你想要什么回报?您尚未初始化变量c
,并且此变量没有正确的记录。因此,Java不允许将“意外或不可预测的内容”写入c
。
答案 2 :(得分:0)
finally
块对return语句是否执行没有任何影响。 (当然,finally
块不应该抛出任何进一步的异常)catch
块确定是否应该进一步传播该异常或在该方法中处理该异常。在给定的示例中,从ArithmeticException
块抛出try
,它将由相应的catch
块处理。当catch
块再次抛出相同的异常时,给定return
语句永远不会执行。
简而言之, return c;
永远不会在上述程序中执行,变量c
将被删除为任何其他本地变量。