2014-07-02 129 views
-3

任何人都可以帮助我,当我执行这个程序时会发生什么。为什么编译器不能告诉编译时异常?

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

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

在此先感谢!

+2

'它应该抛出编译时异常'。为什么? –

+2

我的问题是'为什么?',你的回答是'是'。我很困惑。 –

+0

什么是“编译时异常”。你的意思是“编译时错误”? – Raedwald

回答

10

这是因为您在finally区块中有一个return声明 - 所以IOException实际上不会被抛出getCount()方法。如果finally块突然完成(即它引发异常或具有返回语句),那么整个try/finally或try/catch/finally块将完成。

JLS section 14.20.2

如果try块的执行突然完成,因为值V的抛,然后有一个选择:

  • ...
  • 如果最后由于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语句,所以对try语句的分析结果是它不能抛出异常。

如果将return 10;移至finally块之后,则会得到您所期望的错误。