我们总是试图避免在软件程序中错误的发生,但是百分之百没有错误的程序是不存在的。无论怎样,如果我们能适当的处理错误,将会极大的改善程序的可读性、可靠性以及可维护性。Java编程语言使用异常来处理错误。这章主要讲述在什么时候和怎样使用异常来处理错误
异常处理程序的基本形式
method() throws ExceptionType2,ExceptionType3,……{
……
try {
……//程序块
}
catch (ExceptionType1 e) {
……// 对ExceptionType1的处理
}
catch (ExceptionType2 e) {
……// 对ExceptionType2的处理,处理了一部分,
throw(e); //再抛出这个“异常”给上层的调用者
}
……
finally {……//总是要执行的语句
}
}
异常对象
每个异常都是一个对象,它是Throwable类或
其它子类的实例.当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。
Throwable类有两个标准子类:
错误类:java.lang.Error
错误Error类一般是指虚拟机相关的问题,
异常类:java.lang.Exception
异常Exception类则是指一些可以被捕获且可能恢复的异常情况,如数组下标越界
Java异常类的继承关系
异常实例
设定一个名称为isLegal的变量来检查数据是否合法,如果数据大于0时,返回合法值,否则视为不合法,抛出“异常”。
int isLegal(int dt) throws LowZeroException { //这种定义本文中均称为方法与“异常”通过throws建立了关联
if(dt>=0){
return data;
}
else
throw new LowZeroException();
} /*自已写的异常类,继承自Exception*/
class LowZeroException extends Exception
{
public LowZeroException(){
super();
}
异常的类别
在实际的程序开发中,异常无处不在,并且种类繁
多。区分什么情况下会出现什么样的异常是十分必
要的。
两个不同的角度来区分异常的种类:
异常发生的原因以
编译时对异常的检查
无论是Java的API中定义的诸多异常类还是我们自己定义的异常类(自定义异常在下面本章后面有详细的说明),根据编译器对异常的检查情况,又可以分为可检测异常和不可检测异常两种
常见的可检测异常有:
ClassNotFoundException;//没有找到指定类的定义
IOException;//指示产生某种输入/输出异常。
FileNotFoundException;//文件没有找到异常。
ArithmeticException //没有找到链接地址异常
捕获异常
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally
和所有的捕获异常程序一样,第一步是用try关键字
选定监控异常的代码范围,然后在这段程序之后使用
catch关键字捕获异常,每个try代码块可以使用多个
catch代码块来对应,而catch语句需要指名它所捕获
的异常的类型名。
抛出异常
若在try块中抛出的异常没有能够捕获它的catch块,或捕获这个异常但不想立即处理,则Java将退出这个方法,并将其返回到上一级处理,如此不断地递归向上直到最外一级。同时,在方法的声明中要指定方法中可能产生的异常,使这个方法的调用者准备好处理这种异常的代码,这种类型的异常在此方法的调用者中得到了处理。调用者可能自己处理这种异常,也可能将这个异常放给它的调用者。异常就这样逐级上溯,直到找到处理它的代码为止。如果没有任何代码来捕获并处理这个异常,Java将结束这个程序的执行
Java可能会抛出异常的情况包括:调用的方法抛出了异常、检测到了错误并使用throw语句抛出异常、程序代码有错误,从而导致异常,比如数组越界错误、Java运行时刻系统产生内部错误。当前两种异常发生时,应该告诉使用这个方法的人,此方法强迫Java抛出异常。因为任何抛出异常的方法都是导致程序死亡的陷阱,如果没有任何代码来处理方法抛出的异常,就会导致程序结束
创建自定义异常
现实世界是非常复杂的,常常会有一些特殊的约束要求。例如我们制作一个统计河堤水位的软件,水位过高的时候,对程序本身只是一个较大的数字而已,并不会引发Java类库中的异常;但对于现实中的情况,水位过高就是一个致命的异常。这种情况下,Java类库中的异常处理类已经不能满足要求,我们需要抛出一个新的异常来提示过高的水位:一个自己定义的异常
创建自己的异常类非常的简单,可以用下面的声明语言来定义:
class 自定义异常名 xtends Exception{…}
这里的extends Exception就是我们定义的这个异常类是从java类库中的Exception这个类派生的,
也就是说,我们自定义的异常类可以拥有Exception,这个类的全部的内容,另外,还可以再写我
们需要的内容在里面
假如我们需要抛出一个提示水位过高的异常,我们
可以写一个像下面这样的异常类
class MyException extends Exception
{
private int i;
MyException(int a){ i = a; }
public String toString() {
return “水位过高”;
}
}