public class CheckProg {
public int math(int i) {
try {
int result = i / 0;
// throw new IOException("in here");
} catch (Exception e) {
return 10;
} finally {
return 11;
}
}
public static void main(String[] args) {
CheckProg c1 = new CheckProg();
int res = c1.math(10);
System.out.println("Output :" + res);
}
问题:如果我运行上面的代码,我得到的结果为输出:11
为什么呢?不应该在catch块之前捕获异常并返回吗?
答案 0 :(得分:7)
不应该在catch块之前捕获异常并返回吗?
被捕获,并且返回语句正在执行 ...但是返回值正被{{1中的return语句有效替换阻止,无论是否存在异常都会执行。
有关所有可能性的详细信息,请参阅JLS 14.20.2。在您的情况下,这是路径:
如果由于抛出值V而导致try块的执行突然完成,那么可以选择:
如果V的运行时类型与try语句的任何catch子句的可捕获异常类兼容,则选择第一个(最左边)这样的catch子句。值V分配给所选catch子句的参数,并执行该catch子句的Block。然后有一个选择:
如果catch块正常完成 [...忽略,因为它没有]
如果catch块因为R而突然完成,则执行finally块。然后有一个选择:
如果finally块正常完成 [...忽略,因为它没有]
如果finally块因为S而突然完成,那么try语句突然完成原因S(并且原因R被丢弃)。
因此底线是重要的 - “原因S”(在我们的例子中,返回值11)最终成为finally
语句突然完成的方式。
答案 1 :(得分:1)
是。但是finally块总是在事后执行并且否决了返回值!
答案 2 :(得分:0)
最后,无论是否发生异常,都会执行块。
答案 3 :(得分:0)
这几乎是不言自明的。 Catch块正在执行,因为存在异常。最终将执行,因为它的执行得到保证而不管异常。
注意 - 如果您已经提供了一些其他陈述而不是返回,两个陈述都已执行。但是如果返回,则只执行最后一次返回。
} catch (Exception e) {
System.out.println("10");
} finally {
System.out.println("11");
}
答案 4 :(得分:0)
“finally”关键字用于创建try块后面的代码块。无论是否发生异常,总是会执行最后一段代码。
试 {
final int x=100;
System.out.println("The value of x is"+ x);
}
catch(Exception e)
{
System.out.println(e);
}
finally
{
System.out.println("Finally Block executed");
}