繁体   English   中英

为什么Exception类的行为类似于未检查的异常,并且不需要try块来抛出所有已检查的乃至任何异常?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM