1 父类异常与子类异常之间的捕获关系
1.1 问题
public class Annoyance extends Exception {
}
public class Sneeze extends Annoyance {
}
public class Human {
public static void main() {
try {
try {
throw new Sneeze();
} catch (Annoyance a) {
System.out.println("Caught Annoyance");
throw a;
}
} catch (Sneeze s) {
System.out.println("Caught Sneeze");
return;
} catch (Exception e) {
System.out.println("Caught Exception");
e.printStackTrace();
} finally {
System.out.println("Hello World!");
}
}
}
1.2 结果分析
最上面的代码执行结果是什么呢?答案是:
Caught Annoyance
Caught Sneeze
Hello World!
经过断点的加入,我们发现,尽管
catch (Annoyance a)
这一句使用的是父类的引用,但实际上是子类的对象,这是java中多态的经典表现,在
catch (Sneeze s)
的时候当然可以捕获到自己抛出来的异常了
1.3 证明:子类从本质上无法捕获父类的异常,继续做个试验
try {
throw new Annoyance();
} catch (Sneeze s) {
System.out.println("Caught Sneeze");
return;
} finally {
System.out.println("Hello World!");
}
抛出了父类的异常,使用子类catch,这时候可以通过编译,但运行时呢?
W/System.err: com.example.administrator.demo.exception.Annoyance
W/System.err: at com.example.administrator.demo.exception.Human.main(Human.java:15)
W/System.err: at com.example.administrator.demo.MainActivity.onCreate(MainActivity.java:56)
W/System.err: at android.app.Activity.performCreate(Activity.java:6010)
W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
可以看到,出了问题了,也就是说:父类throw出来的异常,子类并没有捕获到,继续往下证明
try {
try {
throw new Annoyance();
} catch (Annoyance a) {
System.out.println("Caught Annoyance");
throw a;
}
} catch (Sneeze s) {
System.out.println("Caught Sneeze");
return;
} catch (Exception e) {
System.out.println("Caught Exception");
e.printStackTrace();
} finally {
System.out.println("Hello World!");
}
既然子类捕获不了,那就使用Exception,可以看到结果如下:
Caught Annoyance
Caught Exception
1.4 结论
(1)父类throw出来的异常,子类并没有捕获到;
(2)子类throw出来的异常,父类并没有捕获到。