异常是运行时在代码序列中引起的非正常状况,换句话说,异常是运行时错误。在不支持异常处理的计算机语言中,必须手动检查和处理错误----通常是通过使用错误代码,等等。这种方式既笨拙又麻烦。Java的异常处理避免了这些问题,并且在处理过程中采用面向对象的方式管理运行时错误。
1、异常处理的基础概念
Java异常是用来描述在一段代码中发生的异常情况(也就是错误)的对象。当出现引起异常的情况时,就会创建用来表示异常的对象,并在引起错误的方法中抛出异常的对象。方法可以选择自己处理异常,也可以继续传递异常。无论采用哪种方式,在某一点都会捕获并处理异常。异常可以由Java运行时系统生成,也可以通过代码手动生成。由Java抛出的异常与那些违反Java语言规则或Java执行环境约束的基础性错误有关。手动生成的异常通常用于向方法的调用者报告某些错误条件。
Java异常处理通过5个关键字进行管理:try、catch、throw、throws和finally。它们的作用:在try代码块中封装可能发生异常的程序语句,对这些语句进行监视。如果在try代码块中发生异常,就会将异常抛出。代码可以(使用catch)捕获异常,并以某些理性方式对其进行处理。系统生成的异常由Java运行时系统自动抛出。为了手动抛出异常,需要使用throw关键字。从方法抛出的任何异常都必须通过一条throws语句进行指定。在try代码块结束之后必须执行的所有代码块都需要放入finally代码块中。
异常处理代码块一般形式:
try{
//block of code to moniter for errors } catch (ExceptionType1 e) { // exception handler for ExceptionType1 } catch (ExceptionType2 e) { // exception handler for ExceptionType1 } //......... finally{ // block of code to be executed after try bloock ends }其中,ExceptionType2是已经发生的异常的类型。另外从JDK7开始,try语句增加一种支持自动资源管理的新形式,这种形式的try被称为带资源的try。
2、异常类型
所有异常类型都是内置类Throwable的子类。因此,Throwable类位于异常类层次的顶部。紧随Throwable之下的是两个子类,他们将异常分为两个不同 的分支。一个分支是Exception类,这个类既可以用于用户程序应当捕获的异常情况,也可以用于创建自定义异常类型的子类。Exception类有一个重要子类,名为RuntimeException类。对于编写的程序而言,这种类型的异常是自动定义的,包括除零和无效数组索引等情况。
另外一个分支是Error类,该类定义了在常规环境下不希望由程序捕获的异常。Error类型的异常由Java运行时系统使用,以指示运行时环境本身出现了某些错误。堆栈溢出是这类错误的一个例子,它们通常是为了响应灾难性的失败而创建的,程序通常不能处理这类异常。顶级的异常层次如图
3、throws/throw 关键字:
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。下面方法的声明抛出一个 RemoteException 异常:
import java.io.*;
public class className {
public void deposit(double amount) throws RemoteException {
// Method implementation throw new RemoteException();
}
//Remainder of class definition
}
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。下面的方法声明抛出 RemoteException 和 InsufficientFundsException:
import java.io.*;
public class className {
public void withdraw(double amount) throws RemoteException, InsufficientFundsException{
// Method implementation
}
//Remainder of class definition
}
4、finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。