首页 > 代码库 > Java异常

Java异常

P258)重抛异常会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略。此外,异常对象的所有信息都得以保持。

如果只是把当前异常对象重新抛出,那么printStackTrace()方法显示的将原来的异常抛出点的调用栈信息,而并非重新抛出点的信息。要更新这个信息,可以调用fillInStackTrace()方法,这将返回一个Throwable对象,它是通过把当前调用栈信息重新填入原来那个异常对象而建立的。

P259)有可能在捕获异常之后抛出另一种异常。这么做的话,得到的效果类似于使用fillInStackTrace(),有关原来异常发生点的信息会丢失,剩下的是与新的抛出点有点的信息。

 

P260)异常链

现在所有Throwable的子类在构造器中都可以接受一个cause(因由)对象作为参数。这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并抛出新的异常,也能通过这个异常链追踪到异常最初发生的位置。

 

在Throwable的子类中,只有三种基本的异常类提供了带cause参数的构造器。它们是Error(用于Java虚拟机报告系统错误)、Exception以及RuntimeException。如果要把其他类型的异常链接起来,应该使用initCause()方法而不是构造器。

 

P266)finally

甚至在异常没有被当前的异常处理程序捕获的情况下,异常处理机制也会在跳到更高一层的异常处理程序之前,执行finally子句。

因为finally子句总是会执行的,所以在finally块内部,从何处返回无关紧要。

 

P268)异常丢失

如果在finally块中抛出异常,那么在finally块之前被捕获的异常信息将丢失。一种更简单的丢失异常的方式是从finally子句中返回。

 

P269)异常的限制

  1. 异常限制对构造器不起作用,子类的构造器可以抛出任何异常而不必理会基类构造器所抛出的异常。然而,因为基类构造器必须以这样或那样的方式被调用,派生类构造器的异常说明必须包含基类构造器的异常声明。 
  2. 如果父类的某个方法没有抛出异常,那么子类中覆盖的对应方法也不能抛出异常。

P272)回收资源

对于在构造器阶段可能会抛出异常,并且要求清理的类,最安全的使用方式是使用嵌套的try子句。其基本原则是:在创建需要清理的对象之后,立即进入一个try-finally语句块。

Java7里try-with-resources分析

Java7增强的try语句关闭资源

 

Java异常