众所周之,java中子类在覆盖父类方法时,如果父类抛出了异常,子类必须也必须抛出父类的异常或者异常的子类。

下面用用代码来证明这一结论:

package cn.itcast.exception;

//下面定义三个自定义异常类,它们之间的关系如下:
/*
Exception
	|--AException
		|--BException
	|--CException
*/

class AException extends Exception
{
	public AException(String msg)
	{
		super(msg);
	}
}

class BException extends AException
{
	public BException(String msg)
	{
		super(msg);
	}
}

class CException extends Exception
{
	public CException(String msg)
	{
		super(msg);
	}
}

//测试类
class Test
{
	public void function(Fu f)
	{
		try {
			f.show();
		} catch (AException e) {
			System.out.println(e.toString());
		}
	}
}

//定义父类并定义一个show方法抛出A异常
class Fu
{
	public void show() throws AException
	{
		System.out.println("I am father");
		throw new AException("AEception by fu");
	}
}
//定义子类覆盖父类show()方法
class Zi extends Fu
{
	public void show() throws BException
	{
		System.out.println("I am son");
		throw new BException("AException by zi");
	}
}

public class ExceptionDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test t = new Test();
		t.function(new Zi());
	}
}

上面的代码中,测试类Test的function的参数是父类Fu,调用f引用的show()方法,如果捕获异常的话,就应该捕获Fu的show方法的异常或其父类,这样才不会违背多态的特性。

但在传入function的参数时,传递是Fu的Zi类型对象,又用到了多态。f.show()调用的是子类的show方法,如果子类的show方法抛出非Fu类的show()方法的异常或其子类,必然会打破多态特性。