在该计划中:
class Ideone
{
public static void main (String[] args){
try{} catch (NumberFormatException e){ }
}
}
实际上,JLS 11.2.3描述了在这种情况下的行为:
如果catch子句可以捕获检查,则是编译时错误 异常类
E1
并不是try块的情况 对应于catch子句可以抛出一个已检查的异常类 这是E1
的子类或超类,除非E1
是Exception
或者Exception
的超类。
在我的情况下,catch
子句可以捕获既不是Exception
也不是Exception
的超类的NumberFormatException。尝试块可以什么都不扔,因为那里没有语句。那么,为什么代码编译得很好?
答案 0 :(得分:3)
如果catch子句可以捕获已检查的异常,那么这是一个编译时错误...
NumberFormatException
不已检查的例外。它是IllegalArgumentException
的子类,它是RuntimeException
的子类。因此,您从JLS引用的整个条款不适用。
将NumberFormatException
替换为某个不是RuntimeException
的子类的异常(例如,IOException
),您将收到编译时错误。