为什么编译器不会告诉编译时异常?

时间:2014-07-02 14:59:07

标签: java

任何人都可以帮助我,当我执行这个程序时会发生什么。

它应该抛出编译时错误,但它没有给它。

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;
    }
}

提前致谢!!

1 个答案:

答案 0 :(得分:10)

这是因为您的return块中有finally语句 - 因此IOException实际上不会被getCount()方法抛弃。如果finally块突然完成(即它抛出异常或有return语句),那就是整个try / finally或try / catch / finally块完成的方式。

来自JLS section 14.20.2

  

如果由于抛出值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阻止之后,您将收到预期的错误。

相关问题