异常抛出小结(2)

                                                                           返回主页

重新抛出异常

  1. 将异常抛给上一级环境中异常处理程序;
  2. 省略同一个try块后的catch子句;

异常链

在捕获一个异常后抛出另一个异常,希望把原始异常信息保存下来

异常名称可以见名知义

  1. 尽管通常不用捕获RuntimeException异常,但还是可以在代码中抛出RuntimeException类型的异常;
  2. 如果RuntimeException没有被捕获而直接到达main(),那么在程序退出前将调用异常的printSrackTrace()方法;
  3. 只能忽略RuntimeException及其子类类型的异常,其余由编译器强制实施。
    究其原因
    RuntimeException代表编译错误
    1. 无法预料的错误
    2. 作为程序员应该检查的错误,例如数组下标越界

使用finally进行清理

  1. 无论try块中的异常是否抛出都将得到执行
  2. 对于无垃圾回收和析构函数自动调用机制的语言,finally保证无论try块发生什么,内存总会得到释放;
  3. 如果把finally子句和带标签的break及continue配合使用,在java中就没有必要再使用goto语句了

在finally内部,从何处返回无关紧要

  1. java异常实现也会被忽略
  2. 当覆盖方法的时候,只能抛出在基类使用的代码应用到其派生类对象的时候,一样可以工作。

关于异常匹配

1.抛出异常的时候,异常处理系统会按照代码的书写顺序找出“最近”的处理程序,找到匹配的处理程序之后,它就认为异常将得到处理,
然后就不再继续进行查找。
2. 派生类对象也可以匹配其基类的处理程序

异常处理的一个重要原则

只有在你知道如何处理的情况下才捕获异常。

重要目标

把错误处理的代码同错误发生地点相分离
1. 把当前运行环境下能做的事情尽量做完,然后把相同的异常抛到最高层
2. 把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到最高层