第11章异常处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
System.out.println(3/0);
}
}
♦ 测试:Test.java 异常和异常类
TestTrycatch.java
♦ 造成运行时错误的原因很多。比如,用户可能键入一个无效的输入值,程序可能试 图打开一个不存在的文件或试图访问一个越界的数组元素等。当出现一个运行时错误
时,Java 就会产生一个异常。
{
3
handler for exception2 } ... catch (ExceptionN e) { handler for exceptionN } ♦ 对一段可能抛出大量不同类型的异常的程序来说,逐个捕获处理异常可能会较繁 琐,而仅仅捕获它们父类的异常则会较方便。实际使用中,需要避免捕获最一般的异常 类型(即类 Exception),因为捕获最一般的异常使得用户往往不能确切地判断异常的具 体类型并作出相应的处理。 ♦ 若程序中有多个 catch 语句,要注意它们的顺序,正确的做法是先捕获最特殊的异 常(子类异常),之后逐渐一般化(父类异常)。 ♦ 例如: try { ...} catch(Exception e) { System.out.pritnln("The error is: "+e.getMessage()); } catch(IOException e) { System.out.println("The error is: "+e); } catch (FileNotFoundException e){
♦ 异常:程序运行过程中出现的事件,它中断正常的程序控制流。没有异常处理代码 的程序可能非正常结束,引起严重问题。
♦ Java 给程序员提供了处理运行时错误的功能,这称为异常处理。 ♦ 例如,下面的程序会非正常终止,因为除数为 0,引起数值计算错误。
public class Test
{
public static void main(String[] args)
}
♦ 如果异常在当前方法中未被捕获,就会传递给它的调用者。这个过程一直重复进行 到该异常被捕获或者传递给 main 方法。 Throwable 类的常用实例方法 ♦ public String getMessage()
返回 Throwable 对象的详细信息。 ♦ public String toString()
}
method1 {
... try {
... invoke method2; statement2; } catch (Exception2 ex2) { Process ex2; }
}
method2 {
... try {
... invoke method3; statement3; } catch (Exception3 ex3) { Process ex3; }
4
1.这个方法自己捕捉异常,自行处理 try{ } catch(…) { }
2.如果自己不处理,使用 throw 语句向调用者抛出异常对象,交给调用者处理。 Example 11.1 声明,抛出和捕获异常
♦ 目的: 写一个程序测试新的 Rational 类 ♦ 源程序:TestRationalException.java Example 11.2 GUI 程序中的异常 ♦ 程序修改前,错误信息出现在控制台,但是 GUI 应用程序继续运行。 ♦ 程序修改后,如果发现除零异常,将会弹出消息对话框。 ♦ 源程序:MenuDemo 重新抛出异常 ♦ 当一个方法中出现异常时,如果它没有捕获异常,就会立即退出。如果方法在退出 前需要执行某些任务,应该在该方法中捕获异常,然后按如下结构将异常重新抛出,交 给实际处理器去处理。
try {
statements; } catch(TheException e) {
perform operations before exits; throw e; } 语句 throw ex 重新抛出异常,所以其他处理器还有机会进行异常处理。 finally 子句 ♦ 有时不论异常是否出现或者是否被捕获,都希望执行某些代码。Java 有一个 finally 子句可以用来达到这一目的。finally 子句的语法如下所示: try { statements; } catch(TheException e) { handling e; } finally { finalStatements; } 慎用异常 ♦ 异常处理可以将错误处理代码从正常的程序编制工作中分离出来,这样可以使程序 容易阅读和修改。然而应该注意,由于异常处理需要初始化新的异常对象,需要重新返 回调用堆栈并向调用方法传递异常,所以异常处理通常需要更多的时间和资源。
if (an error occurs) {
throw new Exception(); } }
claim exception throw exception
异常处理过程
♦ 一般来说,每一个方法都必须在方法头声明它可能遇到的异常类型 Error 和 RuntimeException 不需声明,这一过程称为声明异常。 ♦ 在 Java 中,当前执行的语句必然属于某个方法。当一个语句引起错误时,含有这 个语句的方法就会创建一个异常对象并将它传递给系统。异常对象包含有关异常的信 息,包括它的类型和出错时程序的状态。这一过程称为抛出异常。抛出异常分为两种 方式:系统自动抛出和用户使用 throw 语句抛出 ♦ 一个方法抛出异常后,Java 运行系统开始寻找用来处理错误的代码。处理错误的代 码称为异常处理器,从当前的方法开始,通过方法调用链向后搜索,查找这一代码。处 理器必须与抛出的异常类型相匹配,如果未发现异常处理器,程序就会终止。这个寻找 异常处理器的过程称为捕获异常。 声明异常 ♦ 声明异常就是告诉编译器在执行方法的过程中可能出现的错误。因为系统错误和运 行错误对于任何代码都可能发生,因此 Java 不要求在方法中显式的声明 Error 和 RuntimeException。如果方法要抛出其他异常,必须在方法声明中明确说明它们。 一般情况下,如果一个方法内含有可能会产生异常的语句,Java 编译器要求该方法要 么自己捕捉处理,要么在方法的首部声明可能会抛出的异常类型。 但是:Error 和 RuntimeException 两类异常既不需捕捉处理也不需在方法首部声明, Java 环境会自动处理。Error 类包括动态链接失败、虚拟机出错等异常,该类异常 Java 不 要求捕获,同时系统也不会抛出该类异常。RuntimeException 通常代表的是编程上的一些 错误,如 null reference,数组越界访问等。与 Error 类相似,运行异常(Runtime Exception) 也不需要程序对其进行捕获并处理,因为它表示 Java 虚拟机在运行时所产生的异常。该类 异常的产生非常普遍,如果在每个可能产生这种异常的地方都加以处理,程序就会变得无法 理解,从而影响程序的可读性和高效性。
System.out.println("The error is: "+e.getMessage()); } 后两个 catch 捕获语句会始终匹配不到,编译时会提示出错。所以说,捕获异常的顺序 是和 catch 语句顺序相关的,要注意它的用法。
main method {
... try {
... invoke method1; statement1; } catch (Exception1 ex1) { Process ex1; }
返回 Throwable 对象的简要描述。 ♦ public void printStackTrace()
在控制台上打印 Throwable 对象和它的追踪信息。 ♦ 例:TestThrowTryCatch.java 总结: 一般情况下,如果一个方法内含有可能会产生异常的语句,并且产生的异常不是 Error 和 RuntimeException 及它们的子类,那么有两种选择:
A W T E rror S ev eral m o re classes
A rith m eticE x cep tio n N u llP o in terE x cep tio n
In dex O u tO fB ou nd sE x ception S ev eral m o re classes
♦ 注意:声明了抛出异常的方法未必会真的抛出异常!
♦ 例:TestThrows.java
TestThrows1.java
异常的抛出: 1.系统自动抛出
当出现系统可识别的错误时,系统会自动抛出系统异常的一个对象,该对象内含有异常的信
息。 2.使用 throw 语句抛出
ቤተ መጻሕፍቲ ባይዱ
当满足用户自定义的异常条件时,用户显式地调用 throw 语句抛出异常对象。
抛出异常 ♦ 在声明了异常的方法中,如果出现异常,就可以抛出一个异常对象。例如: throw new TheException();
或
TheException e = new TheException(); throw e;
♦ 注意:不要和 throws 弄混! ♦ 注 意 : 一 个 方 法 只 能 抛 出 在 方 法 声 明 中 声 明 的 异 常 以 及 异 常 Error 、 RuntimeException 和以上这些异常的子类。
2
♦ 在方法声明中使用关键字 throws 可以声明异常,如: public void myMethod() throws IOException
public void myMethod() throws IOException, OtherException
♦ 在方法头中用关键字 throws 进行声明!
1
声明,抛出和捕获异常 Java 的异常处理基于三种操作:声明异常、抛出异常和捕获异常。
method1() {
catch exception
try {
invoke method2; } catch (Exception ex) {
Process exception; }
}
method2() throws Exception {
♦ Java 异常是 Throwable 子类的一个实例。Throwable 包含在 java.lang 中,它的子 类在不同的包中。与图形相关的错误包含在 java.awt 中,数值异常包含在 java.lang
中。扩展 Throwable 或它的子类,就能创建自己的异常类。
O b ject
T hrow able
第 11 章:异常处理 学习目标
♦ 异常和异常类 ♦ 声明异常 ♦ 抛出异常 ♦ 捕获异常 ♦ 重新抛出异常 ♦ finally 子举 ♦ 慎用异常 ♦ 创建自己的异常类(可选) 引言
三类错误:编译错误、运行时错误和逻辑错误。
♦ 程序运行过程中,如果出现一个不可能执行的操作,就会出现运行时错误。运行时 错误会引起异常。
抛出异常的例子
public double divide(double r1,double r2) throws Exception
{ if (r2 == 0)
{
throw new Exception("denominator cannot be zero"); }
return r1/r2;
}
divide()方法当分母为零时将抛出一个 Exception 异常对象,此异常被抛给 divide()方法
的调用者。在调用者中应该捕获这个异常并进行处理。
捕获异常 ♦ 当调用一个显式声明异常的方法时,必须使用 try-catch 块括住抛出异常的语句。 try
{
statements; }
catch (Exception1 e)
{ handler for exception1
}
catch (Exception2 e)
E x ception
E rror
C lassN o tF o u n d E x cep tio n IO E x cep tio n
A W T E xcep tion R u n tim eE x cep tio n S ev eral m o re classes
L ink ageE rro r V irtualM achineE rro r