【问题标题】:In calling method why Exception can be caught without throwing and why subclass of exception cannot be caught without throwing在调用方法中为什么不抛出就可以捕获异常以及为什么不抛出就不能捕获异常的子类
【发布时间】:2016-02-20 11:17:22
【问题描述】:

在 try 块中捕获不抛出异常子类的方法的异常,编译失败。当我捕捉到异常时,它起作用了。它是如何工作的??

下面这段代码不能编译!!

class Test
{
    public static void main(String[] args) {
        try {
            myMethod();
        } catch(MyException ex) {//Does not compile
        }
    }

    public static void myMethod() {}
}

类 MyException 扩展异常 {}


但是当异常被捕获时,编译器不会抱怨。

class test
{
    public static void main(String[] args)
    {
        try{
            myMethod();
        } catch(Exception ex) {//how does this works ??
        }
    }

    public static void myMethod() {}
}

【问题讨论】:

    标签: java exception-handling


    【解决方案1】:

    来自JLS (§11.2.3):(强调我的)

    如果catch 子句可以catch 被检查,这是一个编译时错误 异常类 E1 并且 try 块不是这种情况 对应catch子句可以抛出检查异常类 是 E1 的子类或超类,除非 E1 是 Exception 或 异常的超类

    【讨论】:

    • 而原因是RuntimeExceptionException的子类,所以捕捉Exception也意味着捕捉未检查的异常。
    【解决方案2】:

    MyException 是一个检查异常。它从未从您的 myMethod() 方法中抛出。所以 catch 块将无法访问。

    Exception 是已检查和未检查(运行时)异常的超类,如果从 myMethod() 抛出任何运行时异常,它将在 catch 块中处理 这是一种可能的情况。因此没有编译错误。

    【讨论】:

    • 为什么要投反对票???我的回答有什么问题?在投反对票之前,您应该始终进行解释
    最近更新 更多