在程序中:
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。尝试块不能抛出任何东西,因为里面没有语句。那么,为什么代码编译得很好呢?
如果 catch 子句可以捕获检查的异常,则这是一个编译时错误......
NumberFormatException
不是已检查的异常。它是IllegalArgumentException
的一个子类,是RuntimeException
的一个子类。因此,您从JLS中引用的整个条款不适用。
将NumberFormatException
替换为一些不是 RuntimeException
子类的异常(例如,IOException
(,您将收到编译时错误。