捕获不在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() {}
}
答案 0 :(得分:3)
来自JLS (§11.2.3) :(强调我的)
如果catch子句可以捕获检查,则是编译时错误 异常类E1并不是try块的情况 对应于catch子句可以抛出一个已检查的异常类 这是E1的子类或超类,,除非E1是Exception或a 超级的超类。
答案 1 :(得分:0)
MyException
是一个经过检查的例外。它永远不会从您的myMethod()
方法中抛出。所以catch块将无法访问。
但Exception
是已检查和未检查(运行时)异常的超类,如果从myMethod()抛出任何运行时异常,它将在catch块中处理
这是一种可能的情况。因此没有编译错误。