- 异常的概念:异常时程序在执行时发生的事件,它会打断指令的正常流程.Java中的异常类型为终止类型。
- 使用异常的原因:在当前环境中还没有足够的信息来解决这个问题,所有就把这个问题提交到更高层次的环境中,在那里做出正确的决定。
- 使用异常的好处:可以降低错误处理代码的复杂度,避免过多的条件测试。
- Java的异常:
- 监控区域:可能产生异常的代码,即try块内部的代码,并且后面跟着处理这些异常的代码。处理异常的代码称为即异常处理程序,即catch块内的代码。
- 异常说明:属于方法声明的一部分,紧跟在形式参数列表之后,用来告知客户端程序员这个方法可能会抛出的异常类型,形式通常是void f() throws xxException{};
- Throwable这个Java类被用来标识任何可以作为异常被抛出的类,Throwable可以分为两种类型:Error表示编译时和系统错误;Exception是可以被抛出的基本类型Java程序员关心的基本类型通常是Exception。
- Exception的子类分类两类:运行时异常和非运行时异常。
- 运行时异常继承于RuntimeException,如NullPointerException,IndexOutOfBoundsException等;他们也被称为“不受检查异常”。对于运行时异常,通常不用捕获,但是可以在代码中抛出RuntimeException。
- 非运行时异常,即所有继承与Exception而不继承与RuntimeExcpetion的异常。它们也被称为“被检查异常”,被检查异常如果被抛出,则需要被捕获,否则会报编译错误。
- 栈轨迹: Throwable类提供一个printStackTrace()方法,它提供的信息可以通过getStackTrace()方法来直接访问,这个方法将返回一个由栈轨迹中的元素所构成的元素所构成的数组,其中每个元素表示一帧。0号元素是张顶元素,并且是调用序列中的最后一个方法调用(这个Throwable被创建和抛出之处)。数组中的最后一个元素是调用调用序列的第一个方法调用。
- 重新抛出异常:
- 捕获异常之后,在异常处理程序里面,做一些处理之后,重新抛出。此时异常对象的所有信息都会得以保持。
try{
//code that generates exception
}catch(Exception e)
{
//cleanup code
throw e;
}
2. 调用异常对象的fillInStackTrace()方式重新抛出。此时,将当前堆栈信息填入原来那个异常对象而建立一个新的异常对象。
try{
//code generate exception
}catch(Exception e)
{
//cleanup code
throw new (Exception)e.fillInStackTrace();
}
3. 异常链方式,如果想捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来,可以使用异常链。Throwable的子类的构造器都可以接受一个cause对象作为参数,这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并抛出的新的异常,也能通过这个异常链跟踪到最初发生的位置。
try{
//code generate excepion
}catch(Exception e)
{
//cleanup code
throw new Exception(e);
}
- 异常的限制:当覆盖方法的时候,只能抛出基类方法的异常说明里列出的那些异常或是它们的子类,或者干脆可以不抛出。
- 派生类构造器不能捕获基类的构造器抛出的异常,只能在派生类构造器中将其抛出。
- 异常匹配:抛出异常的时候,异常系统会按照代码的书写顺序找出“最近”的处理程序。
class MyException extends exception{}
try{
throw new MyException();
}catch(Exception e)
{
//do something
}catch(MyException e)/*unreachable code,compile-error*/
{
//do something
}