Java例外处理 (2)
辽宁经济职业技术学院信息系
硕士、副教授 陈英
定义自己的异常
定义自己的异常有两个基本的原因:
1) 希望当一个标准异常出现时添加信息,并
且可以通过再次抛出你自己的异常来做到
这一点。
2) 你的代码中可以有一些出错条件,以保证
区分出某种特定的类。
但值得注意的是,抛出异常会带来大量
的处理负担,因此不应该经常想用自己
的代码代替正常的异常处理代码。
用户定义异常是通过扩展 Exception类来创建的。
这种异常类可以包含一个“普通”类所包含的
任何东西。
不是由 Java系统监测到的异常 (下标越界,被 0-除
等 ),而是由用户自己定义的异常。
用户定义的异常同样要用 try--catch捕获,但必
须由用户自己抛出 throw new MyException。
异常是一个类,用户定义的异常必须继承自
Throwable或 Exception类,建议用 Exception类。
例,class MyException extends Exception
{….};
定义自己的异常
定义一个异常类
自定义的异常类必须以 Throwable作为超类,
否则它们将不能定义一个异常。
虽然可以从任何标准异常派生出自已的类,
但最好的策略是从 Exception类派生。
按上述作法,编译器可以跟踪记录程序中的
这个异常会在何处抛出,并且检查它们要么
被捕获,要么其抛出在一个方法中被声明。
如果使用 RuntimeExcption或者其它的一个子
类,则编译器对异常类的 catch块的检查将会
受到抑制。
定义一个异常类
public class DreadfulProblemException extends Exception {
public DreadfulProblemException(){ } // Default
constructor
public DreadfulProblemException(String s) {
super(s); // Call the base class constructor
}}
自定义异常应该包括一个默认构造器和一个接受一个
String对象作为参数的构造器。存储在超类 Exception中的
消息将自动使用自定义的类名被初始化。
传递给第二个构造器的 String参数将被追加到类名的后面,
以形成存储在异常对象中的消息。
抛出自己的异常
使用一个由关键字 throw后面跟随着一个异常对
象的语句来抛出一个异常。
例,DreadfulProblemException e = new
DreadfulProblemException();
Throw e;
这时该方法会停止执行,除非上述代码段位于一
个 try或者 catch块并且带有相关的 finally子句,这
个子句中包含着将在该方法结束前执行的语句。
在调用该方法的程序中,调用这个方法的位置将
抛出异常。
异常处理策略
首先应该考虑的是通过程序中的异常处理代
码可以达到什么目的。虽然没有一层不变的
规则,但一般希望能够更正一个问题并且使
程序像什么也没有发生那样继续运行下去。
而在有些情况下,可能最好的做法是输出一
条出错消息并且尽快退出。
快速退出可以通过调用 System类中的 exit()实
现。
小结
异常指出了你的程序中出现的错误。
异常是 Throwable类的子类对象。
Java包含了一组可以由于你的程序代码出错而
自动抛出的标准异常,他们也可以由 Java中的
标准类抛出。
如果一个方法抛出的异常没有被捕获,并且也
没有被 Error类或者 RuntimeException的子类表
示出,那么你必须在该方法的定义中用 throws
子句把这种异常类指出。
异常可以人为地抛出,用 throw new 语句
小结
如果你想在一个方法中处理一个异常,就必
须把可能生成该异常的代码放在一个 try代码
块中。一个方法可以有多个 try代码块。
异常处理代码位于一个 catch块中,这个块紧
跟着包含可能抛出该异常的 try块之后。一个
try块可以有多个 catch块来处理不同类型的异
常。
Finally块用于包含必须在 try块执行之后执行
的代码,而不论 try块的执行是如何结束的。
Finally块总是在方法结束之前执行。
小结
你可以使用 throw语句在一个方法中的任
何位置抛出一个异常。你可以在一个
catch块中再次抛出一个已有的异常,以
便把它传递到调用的方法。
异常可以是系统已经定义好的,也可以是
用户自己定义的。
用户自己定义的异常一定继承自
Throwable或 Exception类
你可以定义自己的异常类,它们一般由
Exception类派生而得。
小结
异常处理的一般格式,正常程序和出错处理分离开来
try {
Java statement;
}
catche(ExceptionType1 ExceptionObject) {
Exception1 handling;}
catche(ExceptionType2 ExceptionObject) {
Exception2 handling;}….
finally {
final handling;
// (统一的出口,最终必定要执行 )
}
小结
把异常传播给堆栈,沿着被调用的顺序往前
寻找,只要找到符合该异常种类彻底异常处
理程序,就交给这部分程序去处理 。
Method1 Method2 Method3 Read-file
call call call
Try catch 产生异常
throwsthrowsthrows
小结
在开发 java程序时考虑到对于异常的处理
,这是整体开发工作不可分割的一部分。程序
代码的强壮与否取决于你对程序中可能抛出的
异常的处理是否有效。
作业
1,编写一个程序生成下列类型的异常
NullPointerException、
NegativeArraySizeException和
IndexOutOfBoundsException。 通过显示每个
异常对象中存储的消息以及栈跟踪记录下每个
异常。
2,在上一个示例中添加一个异常类,它将区分不
同的索引界出错的可能情况。在 divide()中再次
抛出一个异常类型的适当对象,并且在 main()
中处理这个异常。
作业
编写一段程序调用一个方法,此方法会在一
个 for循环的随机迭代中抛出一个
ArithmeticException类型的异常。在该方法
中捕获这个异常并且在出现异常时通过使用
你定义的一个异常类对象把迭代计数传递给
调用的方法。
在上述示例程序中添加一个 finally代码块以
便于工作在方法退出时输出迭代计数值。