java父类和子类的异常问题

最近在看java的面试题,其中有关于子类和父类的异常问题,题目如下

public class MyException {
	public static void main(String[] args) {
		try{
			throw new ExceptionB();
		}catch(ExceptionA a){
			System.out.println("catch ExceptionA");
		}catch (Exception e) {
			System.out.println("catch Exception");
		}
	}
}


class ExceptionA extends Exception{}

class ExceptionB extends ExceptionA{}

上面的代码很简单,根据里氏替换原则(任何基类可以出现的地方,子类一定可以出现),父类会捕获子类异常

输出为catch ExceptionA

还有一道题目,出自《Java编程思想》一书

public class Human {
	public static void main(String[] args) 
	        throws Exception {
	        try {
	            try {
	                throw new Sneeze();
	            } 
	            catch ( Annoyance a ) {
	                System.out.println("Caught Annoyance");
	                throw a;
	            }
	        } 
	        catch ( Sneeze s ) {
	            System.out.println("Caught Sneeze");
	            return ;
	        }
	        finally {
	            System.out.println("Hello World!");
	        }
	    }
}

class Annoyance extends Exception {}
class Sneeze extends Annoyance {}

首先说输出结果

Caught Annoyance
Caught Sneeze
Hello World!

明白第一个题之后对第一行和第三行应该都明白,但是我第一次看的时候对第二行很不理解,难道子类可以捕获父类的异常吗?

其实这个问题只要debug一下代码就知道了

java父类和子类的异常问题_第1张图片

看到这个图片也许你就明白了,是java多态的原理,根本就没有创建父类的对象,a实际上是new Sneeze()的对象,所以能被下面的catch捕获。

你可能感兴趣的:(java基础知识)