异常的限制

读书笔记:
class A1 extends Exception {}
class A2 extends A1 {}
class A3 extends A1 {}
abstract class inning {
public inning() throws A1 { }
public void event() throws A2 { }
public abstract void aBat() throws A1, A2;
public void walk() { }
}
class B1 extends Exception {}
class B2 extends B1 {}
class B3 extends A2 {}
interface Storm {
public void event() throws B1;
public void rainHard() throws B2;
}
public class NeverCaught extends inning implements Storm {
public NeverCaught() throws B2, A1 { }
public NeverCaught(String s) throws A2, A1 { }
public void rainHard() throws B2 { }
public void event() { }
public void walk() {
super.walk();
}
public void aBat() throws B3 {
}
public static void main(String[] args) {
try {
NeverCaught n = new NeverCaught();
n.aBat();
} catch (B3 b3) {
System.out.println("b3");
} catch (B2 b2) {
System.out.println("b2");
} catch (A1 a1) {
System.out.println("a1");
}
try {
inning in = new NeverCaught();
in.aBat();
} catch (A3 a3) {
System.out.println("a3");
} catch (A2 a2) {
System.out.println("a2");
} catch (B2 b2) {
System.out.println("a1");
} catch (A1 a1) {
System.out.println("a1");
}
}
}


1.inning类中,构造器和event方法都生命抛出异常,实际上却没抛出,抽象方法abat()也可以不用抛出。基类中抛出异常的方法,子类可不声明,
2.如果接口的方法不是来自于基类,接口里的rainHard方法可抛出任何异常
3.NeverCaught的event因为继承基类和实现接口基类都有此方法,并且基类方法都有异常声明,否则使用基类的时候就不能改变inning中方法的声明
4.异常限制对构造器不起作用
5.重载后的event方法显示:派生类方法可以不抛出任何异常即时是基类定义的异常,因为即使基类方法会抛出异常,这样做不会破坏已有程序,
public void aBat() throws B3
它抛出B3,B3继承基类的的abet()的话,你就肯定捕获B3,如果你写的代码同inning打交道的话,并且调用了他的abet方法,因为B3继承了A2,所以异常也能处理A2。

6.main方法,如果你处理的是NeverCaught对象的话,编译器只会强制你捕获这个类抛出的异常,如果转换成基类的话,就会强制你捕获基类的异常。

尽管继承过程中,编译器对异常说明做强制要求,但异常说明并不是方法原型的一部分,方法原型是由方法的名字与参数的类型组成,因此你不能根据异常说明的不同来重载方法,
一个基类方法的异常说明不一定出现在子类方法的异常说明里面,
这一点与继承的规程明显不同,基类的方法必须出现在子类里面,继承和重载过程中,方法的异常说明的接口不是变大了而是变小了。。这恰好和类接口在继承时候的情形相反。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值