java异常总结
一.简介
程序运行时发生的不被希望的事件,导致程序不能正常运行,就是异常。
异常处理机制能让程序在发生异常时,按照代码预先设计的异常处理逻辑,针对性的处理异常,让程序尽最大可能恢复正常并继续执行。
二.分类
Throwable是java异常类型的顶层父类,又派生出了Error类和Exception类。
Error类及其子类的实例代表JVM本身的错误。不能通过程序员通过代码处理,所以我们应该关注Exception下的各种异常类。
Exception以及他的子类,代表程序运行时发生的各种不期望发生的事件。可以被java异常处理机制使用,是异常处理的核心。
异常又可被分为非检查异常(unchecked exception)和检查异常(checked exception)。
非检查异常(unchecked exception):Error和RuntimeException以及他们的子类。编译器不要求处理,一般来说是代码写的有问题。常见的有:ArithmeticException , ClassCastException , ArrayIndexOutOfBoundsException , NullPointerException
检查异常(checked exception):除了Error和RuntimeException的其它异常。要求必须进行处理(使用try...catch...finally或者throws)。一般由运行环境改变导致。当环境改变后我们却无法进行干预,所以我们应该为这种异常提前做好准备。常见的有:SQLException , IOException , ClassNotFoundException等。
三.异常处理的三种方式
try...catch...finally
throws
throw
较为基础,不做记录。
四.异常的链化
有A,B两个模块,B调用A,当A发生异常时则B也会因为不能完成相应功能而发生异常,但是在B抛出异常时会将A的异常信息掩盖掉,使得异常根源信息丢失。异常的链化解决了这个问题,使得异常信息不会丢失。
异常链化:以一个异常对象为参数构造新的异常对象,新的异常对象将包含先前的异常信息。是以异常类的一个带Throwable参数的函数来实现的,如下所示:
public class Throwable implements Serializable { private Throwable cause = this; public Throwable(String message, Throwable cause) { fillInStackTrace(); detailMessage = message; this.cause = cause; } public Throwable(Throwable cause) { fillInStackTrace(); detailMessage = (cause==null ? null : cause.toString()); this.cause = cause; } //........ }
可以发现有一个Throwable字段cause,它保存了根源异常参数。
五.自定义异常
一个自定义异常应当包含以下几个构造函数:
(1)一个无参构造函数。
(2)一个带有String参数的构造函数,并传递给父类的构造函数。
(3)一个带有String参数和Throwable参数的构造函数,并传递给父类的构造函数。
(4)一个带有Throwable参数的构造函数,并传递给父类的构造函数。
可以借鉴IOException:
public class IOException extends Exception { static final long serialVersionUID = 7818375828146090155L; public IOException() { super(); } public IOException(String message) { super(message); } public IOException(String message, Throwable cause) { super(message, cause); } public IOException(Throwable cause) { super(cause); } }