异常的限制,异常说明在类继承是怎样的?

package com.lwf.thinking.eight;
class BaseBallException extends Exception{}
class Foul extends BaseBallException{}
class Strike extends BaseBallException{}
abstract class Inning{
	public Inning() throws BaseBallException{}
		//注意构造方法抛出了异常。
	public void event() throws BaseBallException{
		//这里并没有显式throw new BaseBallException();
	}	
	public  abstract void getName() throws Foul,Strike;
	
	public  void getAge(){}
}

class StormException extends Exception{}
class RainedOut extends StormException{}
class PopFoul extends Foul{}
interface Storm{
	public void event() throws RainedOut;
	public void rainHard() throws RainedOut;
}
public class UserDefineException extends Inning implements Storm{
	public UserDefineException() throws BaseBallException,RainedOut{
		//1、因为基类的构造方法抛出了异常,根据继承机制,实例化该类必然调用基类实例化,所以该类的构造方法必须显式抛出异常
		//2、派生类的构造方法可以抛出基类所没有抛出的异常如RainedOut,注意这一点非构造方法不行。
		
	}
	public UserDefineException(String s) throws BaseBallException,PopFoul{}//只要抛出类型包含了BaseBallException即可,类国基类只抛出此类型
	
//	public void getName() throws Foul, Strike{}
		//3、派生类抛出与基类所抛出的对应异常。
//	public void getName() throws Foul{}
//	public void getName() throws Strike{}
		//4、仅抛出与基类该方法抛出异常中的任意一个
	public void getName() throws PopFoul{	}
		//5、上例中抛出了从Foul继承而来的PopFoul异常
	//	public void getName(){}
		//6、不抛出任何对应异常
//	public void getName() throws BaseBallException{}
		//7、compile error,抛出了不与基类对应的抛出异常,注意这里BaseBallException是Strike和Foul的父类也是不行的。
	
	public void event(){}
	//如果这里没有event方法,程序将报错:意思是抽象类与接口所抛出的异常不兼容。
	//注意两个基类抛出了不同的异常:这时即使用public void event() throws BaseBallException, RainedOut{}也是不行的。
	public void rainHard() throws RainedOut{}
	
	public static void main(String[] args){
		try {
			UserDefineException u = new UserDefineException();
			u.getName();
		} catch (PopFoul e){
			System.out.println("PopFoul");
		} catch (RainedOut e) {
			System.out.println("RainedOut");
		} catch (BaseBallException e) {
			System.out.println("BaseBallException");
		}
		try {
			Inning i = new UserDefineException();
			i.getName();
			//向上转型才要求捕获基类所抛出异常,如果不进行向上转型是可以不要求捕获的。
		} catch (RainedOut e) {
			System.out.println("RainedOut");
			
		} catch (Foul e) {
			System.out.println("BaseBallException");
		} catch (Strike e) {
			e.printStackTrace();
		} catch (BaseBallException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
	}
}
/*
 * 总结一下关于异常的限制:
 * 对构造方法:基类构造方法抛出异常,派生类构造方法必须显式抛出对应异常(如上例第1点),且可以抛出其它异常,(如上例第2点)
 * 	实质上来说异常限制对构造器不起作用,即构造器可抛出任何异常,但因为派生类构造器不能捕获基类构造器抛出的异常,所以派生类所抛出异常中必须要包含基类所抛出的异常。
 * 对普通方法:基类普通方法抛出异常,派生类普通方法可抛出对应异常(如上例第3点)、可少抛出异常(如上例第4点)、
 * 			      可抛出对应基类异常的继承异常子类(如上例第5点)、也可不抛出异常(如上例第6点),但不能抛出与基类不对应的异常(如上例第7点)
 * 特殊情况:上例中的event方法,因为基类和接口都有event方法,并且抛出的异常类型又不相同,那么注意的是派生这里只有选择不抛出异常,因为
 * 			   不管抛出哪一个或是抛出两个都是不行的。
 * 
 * 异常说明:
 * 			异常说明本身并不属于方法原型的一部分,所以不能根据异常说明的不同来重载方法。
 * 			一个出现在基类异常说明中的异常,不一定会出现在派生类的异常说明中。这点与继承的规则是不同的。
 * 
 */ 
 

你可能感兴趣的:(异常的限制,异常说明在类继承是怎样的?)