任何人都可以帮助我,当我执行这个程序时会发生什么。
它应该抛出编译时错误,但它没有给它。
public class Test {
public static void main(String args[]){
int c = getCount();
System.out.println(c);
}
private static int getCount() {
try{
throw new IOException();
}finally{
return 10;
}
}
提前致谢!!
答案 0 :(得分:10)
这是因为您的return
块中有finally
语句 - 因此IOException
实际上不会被getCount()
方法抛弃。如果finally
块突然完成(即它抛出异常或有return语句),那就是整个try / finally或try / catch / finally块完成的方式。
如果由于抛出值V而导致try块的执行突然完成,那么可以选择:
- ...
- 如果finally块因为S而突然完成,那么try语句突然完成原因S(并且丢弃并抛弃值V的抛出)。
从section 11.2.2(陈述的例外分析) - 重点是我的:
try语句(§14.20)可以抛出异常类E iff:
- try块可以抛出E,或者用于初始化资源的表达式(在try-with-resources语句中)可以抛出E,或者自动调用资源的close()方法(在try-中) with-resources语句)可以抛出E,并且E不与try语句的任何catch子句的任何可捕获异常类兼容,并且不存在finally块或者finally块可以正常完成
- ...
在你的情况下,由于return语句,finally块不能正常完成(即到达右括号),因此try语句的分析结果是它不能抛出异常。
如果您将return 10;
移至finally
阻止之后,您将收到预期的错误。