尝试块可以什么都不扔,但是没有发生编译时错误

时间:2015-02-15 10:50:32

标签: java exception

在该计划中:

class Ideone
{
    public static void main (String[] args){
        try{} catch (NumberFormatException e){ }
    }
}

DEMO

实际上,JLS 11.2.3描述了在这种情况下的行为:

  

如果catch子句可以捕获检查,则是编译时错误   异常类E1并不是try块的情况   对应于catch子句可以抛出一个已检查的异常类   这是E1的子类或超类,除非E1Exception或者   Exception的超类。

在我的情况下,catch子句可以捕获既不是Exception也不是Exception的超类的NumberFormatException。尝试块可以什么都不扔,因为那里没有语句。那么,为什么代码编译得很好?

1 个答案:

答案 0 :(得分:3)

  

如果catch子句可以捕获已检查的异常,那么这是一个编译时错误...

NumberFormatException 已检查的例外。它是IllegalArgumentException的子类,它是RuntimeException的子类。因此,您从JLS引用的整个条款不适用。

NumberFormatException替换为某个不是RuntimeException的子类的异常(例如,IOException),您将收到编译时错误。