[英]Why JVM does not allow to throw Unchecked Exception from static block?
[英]Why Exception class behaves like unchecked exception and does not require try block to throw any checked or even any exceptions at all?
异常是已检查的异常。 当相应的try块什么都没扔时,为什么我可以写catch (Exception e)
? 任何其他经过检查的异常(如IOException)均不允许使用此技巧。 一些书说Throwable也应被视为检查异常,但是它的行为就像Exception。
void f() {
try {
} catch (Exception e) { // fine!
}
}
void f() {
try {
} catch (Throwable e) { // also fine!
}
}
PS在JLS中发现了这一点:
如果catch子句可以捕获经过检查的异常类E1,则是编译时错误,并且与catch子句相对应的try块不能抛出作为E1的子类或超类的经过检查的异常类, 除非E1是Exception或Exception的超类。
如果查看Exception
的代码,您会发现它扩展了Throwable:
public class Exception extends Throwable
n可以throw
任何东西都是Throwable
。 尽管这提供了一定程度的灵活性,因为您可以创建一个扩展可抛出(也可以抛出)的自定义类。 异常几乎只是Throwable的简约包装。 所以本质上:
try{
//something here that goes wrong causing:
throw new Exception("Thrown");
}catch(Throwable e){
System.out.println("Caught");
}
尽管捕获异常也可以。 但是,如果您创建一个扩展Throwable的新类,则捕获Exception
无效。
这意味着,如果可以将Exception作为通用语句捕获,则还可以捕获其超类Throwable。 请注意,这样做不是一个好习惯,但是我提到它是因为有可能。 如果您必须抓住一些常规的东西,那就抓住Exception,而不是Throwable。
路易斯·瓦瑟曼的评论是正确的。 Exception是RuntimeException的超类。 因此,捕获异常也会捕获所有未检查的异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.