在调用方法中,为什么可以在不抛出的情况下捕获异常,以及为什么在不抛出的情况下无法捕获异常的子类

时间:2016-02-20 11:17:22

标签: java exception-handling

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

以下代码无法编译!!

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

    public static void myMethod() {}
}

class MyException扩展了Exception {}

但是当捕获到Exception时,编译器不会抱怨。

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

    public static void myMethod() {}
}

2 个答案:

答案 0 :(得分:3)

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

  

如果catch子句可以捕获检查,则是编译时错误   异常类E1并不是try块的情况   对应于catch子句可以抛出一个已检查的异常类   这是E1的子类或超类,,除非E1是Exception或a   超级的超类

答案 1 :(得分:0)

MyException是一个经过检查的例外。它永远不会从您的myMethod()方法中抛出。所以catch块将无法访问。

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