第 6章 Java语言中的异常异常
为了加强程序的 鲁棒性 (强壮性,robust),
程序设计时,必须考虑到可能发生的异常事件并做出相应的处理
例 6-1
虽然程序的鲁棒性加强了,但结构臃肿,大量的错误处理代码混杂在程序中,可读性差。目标程序也会增大许多
出错返回信息量太少,无法更确切的了解错误状况或原因。特别是,当出现上述语句没包含的情况时,程序将束手无策
Java异常处理机制
预定义了 Exception类。在 Exception类中定义了程序产生异常的条件
简化了代码的编写。常见的异常也可以统一处理,提高了效率,代码重用率高
允许程序员自己编写特殊的异常处理程序,
以满足更独特的需要抛出和捕获
方法的运行过程中,如果发生了异常,称程序产生了一个异常事件,相应地生成异常对象。生成异常对象并把它提交给运行时系统的这一过程称为 抛出( throw) 异常
异常发生时,Java运行时系统从生成对象的代码块开始进行回溯,找到包含相应异常处理的方法,
并把异常对象交给该方法处理,这一过程称为 捕获( catch)
例 6-2 用异常处理方式来重写例 6-1
异常机制的优点
把异常处理代码从常规代码中分离出来,
增加了可读性,方便修改
按异常类型和差别进行分组,即从预定义的类 Exception中派生自己的子类,对无法预测的异常也可以进行捕获和处理,克服了传统方法中错误信息有限的问题
异常的处理借助于调用堆栈按先近后远的原则进行异常传播方式
method1
method2
method3
method4 探测抛出异常传递捕获处理异常调用异常 层次结构使用异常机制情况
当方法因为自身无法控制的原因而不能完成其任务
文件不存在,网络连接无法建立等
处理在方法、类库、类中抛出的异常
如 FileInputStream.read产生 IOException;
在大的项目中采用统一的方式处理异常时
编写文字处理器一类的程序等;
不经常发生但却可能发生的故障异常示例
简单扩展前面使用过的程序 1-1的
HelloWorldApp.java程序,循环打印一些信息。程序执行到第 4次循环时,会发生异常代码见 程序 6-1
异常处理
try,catch和 finally语句
例 6-3
try {
// 此处为抛出具体异常的代码
} catch (ExceptionType1 e) {
// 抛出 ExceptionType1异常时要执行的代码
} catch (ExceptionType2 e) {
// 抛出 ExceptionType2异常时要执行的代码
...
} catch (ExceptionTypek e) {
// 抛出 ExceptionTypek异常时要执行的代码
}finally {
// 必须执行的代码
}
程序 6-2示例
程序 6-2改写了程序 6-1。在程序中,捕获所发生的异常,将越界的下标重新置回 0,然后让程序继续执行公共异常
ArithmeticException
整数除法中,如果除数为 0,则发生该类异常
NullPointerException
访问没有实例化的对象或调用它的方法
int i = 12 / 0;
image im [ ] = new image [4];
System.out.println(im[0].toString());
公共异常
NegativeArraySizeException
创建数组时,元素个数是个负数
ArrayIndexOutOfBoundsException
数组下标越界
SecurityException
一般在浏览器内抛出。
若 Applet试图进行下述操作,则抛出此异常:
访问本地文件。
打开一个套接口,而不是返回到提供 Applet的主机。
在运行时环境中运行另一个程序。
公共异常
ArrayStoreException
程序试图存取数组中错误的数据类型
FileNotFoundException
试图存取一个并不存在的文件
IOException
通常的 I/O错误异常分类
在 Java中主要有三类异常。类 java.lang.Throwable是使用异常处理机制可被抛出并捕获的所有异常对象的父类。
它有三个基本子类,如图所示。
Exception Error
RuntimeException
Throwable
每个类使用的目的
Error
表示很难恢复的错误,如内存越界。交给系统处理为好
RuntimeException
用来 表示设计或实现方面的问题,如数组越界等。因为设计和实现正确的程序不会引发这类异常,所以常常不处理它
发生这类异常时,运行时环境会输出一条信息,提示用户修正错误
其他
异常表示运行时因环境的影响可能发生并可被处理的问题。如文件没找到或不完整的 URL等。程序员处理它们抛出
如果一个方法确实引发了一个异常,那么在方法中必须写明相应的处理代码。 (Error或 RuntimeException两类错误除外 )
程序员处理异常有两种方法,
一种是使用 try{},catch(){}块,捕获到所发生的异常类,
并进行相应的处理。 catch块可以为空,表示对发生的异常不进行处理
另一种方法是,程序员不在当前方法内处理异常,而是把异常抛出到调用方法中。在说明方法时使用如下格式就可做到这一点异常抛出
异常抛出格式
<访问权限修饰符 ><返回值类型 ><方法名 > (参数列表 ) throws 异常列表
public void troubleSome() throws IOException
创建自己的异常
用户自定义的所有异常类都必须是
Exception的子类
在程序中发现异常情况时,可以抛出
( throw)一个异常实例,将其放到异常队列中去,并激活 Java的异常处理机制,如:
public class MyException extends Exception {...}
throw new MyException ()
程序 6-3
程序 6-3定义自己的异常客户 -服务器程序
考虑客户 -服务器程序。在客户端代码中,可以尝试与服务器连接,并期望服务器在 5秒内作出响应。
如果服务器没有响应,则客户端代码就抛出一个异常,用户可以把这个异常定义为
ServerTimedOutException
为了加强程序的 鲁棒性 (强壮性,robust),
程序设计时,必须考虑到可能发生的异常事件并做出相应的处理
例 6-1
虽然程序的鲁棒性加强了,但结构臃肿,大量的错误处理代码混杂在程序中,可读性差。目标程序也会增大许多
出错返回信息量太少,无法更确切的了解错误状况或原因。特别是,当出现上述语句没包含的情况时,程序将束手无策
Java异常处理机制
预定义了 Exception类。在 Exception类中定义了程序产生异常的条件
简化了代码的编写。常见的异常也可以统一处理,提高了效率,代码重用率高
允许程序员自己编写特殊的异常处理程序,
以满足更独特的需要抛出和捕获
方法的运行过程中,如果发生了异常,称程序产生了一个异常事件,相应地生成异常对象。生成异常对象并把它提交给运行时系统的这一过程称为 抛出( throw) 异常
异常发生时,Java运行时系统从生成对象的代码块开始进行回溯,找到包含相应异常处理的方法,
并把异常对象交给该方法处理,这一过程称为 捕获( catch)
例 6-2 用异常处理方式来重写例 6-1
异常机制的优点
把异常处理代码从常规代码中分离出来,
增加了可读性,方便修改
按异常类型和差别进行分组,即从预定义的类 Exception中派生自己的子类,对无法预测的异常也可以进行捕获和处理,克服了传统方法中错误信息有限的问题
异常的处理借助于调用堆栈按先近后远的原则进行异常传播方式
method1
method2
method3
method4 探测抛出异常传递捕获处理异常调用异常 层次结构使用异常机制情况
当方法因为自身无法控制的原因而不能完成其任务
文件不存在,网络连接无法建立等
处理在方法、类库、类中抛出的异常
如 FileInputStream.read产生 IOException;
在大的项目中采用统一的方式处理异常时
编写文字处理器一类的程序等;
不经常发生但却可能发生的故障异常示例
简单扩展前面使用过的程序 1-1的
HelloWorldApp.java程序,循环打印一些信息。程序执行到第 4次循环时,会发生异常代码见 程序 6-1
异常处理
try,catch和 finally语句
例 6-3
try {
// 此处为抛出具体异常的代码
} catch (ExceptionType1 e) {
// 抛出 ExceptionType1异常时要执行的代码
} catch (ExceptionType2 e) {
// 抛出 ExceptionType2异常时要执行的代码
...
} catch (ExceptionTypek e) {
// 抛出 ExceptionTypek异常时要执行的代码
}finally {
// 必须执行的代码
}
程序 6-2示例
程序 6-2改写了程序 6-1。在程序中,捕获所发生的异常,将越界的下标重新置回 0,然后让程序继续执行公共异常
ArithmeticException
整数除法中,如果除数为 0,则发生该类异常
NullPointerException
访问没有实例化的对象或调用它的方法
int i = 12 / 0;
image im [ ] = new image [4];
System.out.println(im[0].toString());
公共异常
NegativeArraySizeException
创建数组时,元素个数是个负数
ArrayIndexOutOfBoundsException
数组下标越界
SecurityException
一般在浏览器内抛出。
若 Applet试图进行下述操作,则抛出此异常:
访问本地文件。
打开一个套接口,而不是返回到提供 Applet的主机。
在运行时环境中运行另一个程序。
公共异常
ArrayStoreException
程序试图存取数组中错误的数据类型
FileNotFoundException
试图存取一个并不存在的文件
IOException
通常的 I/O错误异常分类
在 Java中主要有三类异常。类 java.lang.Throwable是使用异常处理机制可被抛出并捕获的所有异常对象的父类。
它有三个基本子类,如图所示。
Exception Error
RuntimeException
Throwable
每个类使用的目的
Error
表示很难恢复的错误,如内存越界。交给系统处理为好
RuntimeException
用来 表示设计或实现方面的问题,如数组越界等。因为设计和实现正确的程序不会引发这类异常,所以常常不处理它
发生这类异常时,运行时环境会输出一条信息,提示用户修正错误
其他
异常表示运行时因环境的影响可能发生并可被处理的问题。如文件没找到或不完整的 URL等。程序员处理它们抛出
如果一个方法确实引发了一个异常,那么在方法中必须写明相应的处理代码。 (Error或 RuntimeException两类错误除外 )
程序员处理异常有两种方法,
一种是使用 try{},catch(){}块,捕获到所发生的异常类,
并进行相应的处理。 catch块可以为空,表示对发生的异常不进行处理
另一种方法是,程序员不在当前方法内处理异常,而是把异常抛出到调用方法中。在说明方法时使用如下格式就可做到这一点异常抛出
异常抛出格式
<访问权限修饰符 ><返回值类型 ><方法名 > (参数列表 ) throws 异常列表
public void troubleSome() throws IOException
创建自己的异常
用户自定义的所有异常类都必须是
Exception的子类
在程序中发现异常情况时,可以抛出
( throw)一个异常实例,将其放到异常队列中去,并激活 Java的异常处理机制,如:
public class MyException extends Exception {...}
throw new MyException ()
程序 6-3
程序 6-3定义自己的异常客户 -服务器程序
考虑客户 -服务器程序。在客户端代码中,可以尝试与服务器连接,并期望服务器在 5秒内作出响应。
如果服务器没有响应,则客户端代码就抛出一个异常,用户可以把这个异常定义为
ServerTimedOutException