我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Java》,我才明白其中的道理,现在我再来温习一下。

一、子类方法只能抛出父类方法的异常或者是其子异常

  对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常

package thinkinginjava;

public abstract class InningDemo1 {
public void walk() throws BaseException{}
public abstract void sing() throws BaseException;
} class BaseException extends Exception{}
class SubException1 extends BaseException{}
class CupException extends Exception{}
package thinkinginjava;

public interface OtherFunction {
public void task() throws RuntimeException;
package thinkinginjava;

public class SubInningDemo1 extends InningDemo1 implements OtherFunction{
//子类方法可以抛出父类方法的异常
@Override
public void walk() throws BaseException{} //但不能抛出父类中没有的异常,否则编译会出错
//public void walk() throws Exception{} //子类方法可以抛出父类方法的子异常
@Override
public void sing() throws SubException1{} //当实现的接口和父类中的方法都有异常时,可以选择不抛出异常
public void task(){} }

  就拿这个例子来说,假如子类中有这方法 public void walk() throws CupException{},抛出了父类方法没有的异常,我们使用父类的引用指向子类

  public void f(){

    InningDemo1 inn = new SubInningDemo1();

    inn.walk() ;//父类调用walk()方法时,并不知道它会抛出CupException,从而f()方法不知如何捕获异常。因此在编译期就要防止子类方法乱抛异常。

  }

  从上面的例子中,我们也可以看到,子类方法可以不抛出异常

二、子类构造器必须要抛出父类构造器的异常或者其父异常

  这是因为子类构造器中默认添加了父类的构造器

package thinkinginjava;

public abstract class InningDemo2 {
public InningDemo2() throws SubException{ }
} class FatherException extends Exception{}
class SubException extends FatherException{}
class PenException extends Exception{}
package thinkinginjava;

public class SubInningDemo2 extends InningDemo2{
public SubInningDemo2() throws FatherException {
//子类构造器中默认添加了父类的构造器,所以需要抛出父类的异常或者其父异常
//super();
}
}

三、异常丢失

1、在finally中抛出异常,可能会之前抛出的异常丢失

package thinkinginjava;

public class FinallyException {
public static void main(String[] args){
try{
try{
throw new RedException();
}finally{
//把上一个异常覆盖掉
throw new BlueException();
}
}catch(Exception e){
System.out.println(e);
}
}
} class RedException extends Exception{}
class BlueException extends Exception{}

运行结果:thinkinginjava.BlueException

2、在finally中使用return,不会抛出异常

package thinkinginjava;

public class ReturnException {
public static void main(String[] args){
try{
throw new Exception();
}finally{
return;
}
}
}

以上代码我们看到它抛出了异常,但运行时不会有任何输出

最新文章

  1. java常用设计模式
  2. ASP.NET中的Image和ImageButton控件
  3. c# DataTable 中 Select 和 Clone 用法结合
  4. [PeterDLax著泛函分析习题参考解答]第5章 赋范线性空间
  5. 揭开Linux操作系统的Swap交换区之谜
  6. JSON的BUG
  7. FMS中的onStatus
  8. httpclient 学习
  9. sqlserver 获取汉字拼音的首字母(大写)函数
  10. Qt 给控件QLineEdit添加clicked事件方法
  11. 实现一个simple 3层的神经网络
  12. #1 Python灵活技巧
  13. Libre OJ 144、145 (DFS序)
  14. python 全栈开发,Day92(编程式的导航,vue页面布局,marked包的使用)
  15. D - Equation Again
  16. 安装指定版本的docker
  17. Linux 线程占用CPU过高定位分析
  18. pthread动态库命名规则
  19. 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)
  20. ASP.NET Ajax 客户端框架未能加载、"Sys"未定义

热门文章

  1. 图解CSS3制作圆环形进度条的实例教程
  2. [Django]用户权限学习系列之权限管理界面实现
  3. Github使(zhuang)用(bi)指南
  4. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店
  5. 如何在VMware中安装Windows Phone SDK 8.0 (支持模拟器调试)
  6. MySQL对时间戳的转换处理
  7. xamarin android ListView手动分组
  8. Java中六大时间类的使用和区别
  9. Win下必备利器之Cmder
  10. php 查询