资源预览内容
第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
第9页 / 共36页
第10页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第9章 异常处理 n了解异常处理的基础知识 n理解异常处理机制 n自定义异常类的使用 9.1异常处理基础 n异常就是在程序的运行过程中所发生的异常事 件,它中断指令的正常执行。Java中提供了一 种独特的处理异常的机制,通过异常来处理程 序设计中出现的错误。当程序运行出现异常时 ,Java运行环境就用异常类Exception的相应子 类创建一个异常对象,并等待处理,例如,读 取一个不存在的文件时,运行环境就用异常类 IOException创建一个对象。异常对象可以调用 如下方法得到或输出有关异常的信息。 9.1.1异常示例 【例9-1】 读取一个不存在的文件时,系统编译的时候报异 常。 import java.io.*; class ExceptionDemo1 public static void main(String args) throws IOException FileInputStream fis = new FileInputStream(test.txt); int b; while (b = fis.read() != -1) System.out.print(b); fis.close(); n查看程序的编译结果: n编译结果提示:第4行会出现异常,必须对其 进行捕获或声明抛出,否则程序编译无法通过 。 9.1.2异常类的层次 n在jdk中,每个包中都定义了异常类,而所有的异 常类都直接或间接地继承于Throwable类。图9-1 为jdk中异常类的继承关系。 n异常的继承结构:基类为Throwable,Error和 Exception继承Throwable,RuntimeException 和IOException等继承Exception,具体的 RuntimeException继承RuntimeException。 9.1.3异常类的分类 nJava中的异常类可分为两大类: Error和Exception。 nError动态链接失败,虚拟机 错误等,通常Java程序不应该捕获 这类异常,也不会抛弃这种异常。 nException包括运行时异常和 非运行时异常。 1)运行时异常: n继承于RuntimeException的类都属于 运行时异常,例如算术异常(除零错 )、数组下标越界异常等等。由于这 些异常产生的位置是未知的,Java 编 译器允许程序员在程序中不对它们做 出处理。 2)非运行时异常: n除了运行时异常之外的其他由Exception 继承 来的异常类都是非运行时的异常,例如 FileNotFoundException(文件未找到异常) 。Java编译器要求在程序中必须处理这种异常 ,捕获异常或者声明抛弃异常。 1Error体系类型异常的特点 nError类体系描述了Java运行系统中的内部错 误以及资源耗尽的情形。应用程序不应该抛出 这种类型的对象(一般是由虚拟机抛出)。如 果出现这种错误,除了尽力使程序安全退出外 ,在其他方面是无能为力的。所以,在进行程 序设计时,应该更关注Exception体系。 2Exception体系类型异常的特点 nException体系包括RuntimeException体系和其他非 RuntimeException的体系 n(1)RuntimeException nRuntimeException体系包括错误的类型转换、数组越界访 问和试图访问空指针等等。处理RuntimeException的原则 是:如果出现RuntimeException,那么一定是程序员的错 误。例如,可以通过检查数组下标和数组边界来避免数组 越界访问异常。 n(2)其他(IOException等等) n这类异常一般是外部错误,例如试图从文件尾后读取数据 等,这并不是程序本身的错误,而是在应用环境中出现的 外部错误。 9.2异常的处理 nJava语言中有两种异常处理机制:捕获异常和声明抛弃异 常。 n(1)捕获异常: n当Java运行环境得到一个异常对象时,它将会沿着方法的 调用栈逐层回溯,寻找处理这一异常的代码。找到能够处 理这种类型的异常的方法后,运行环境把当前异常对象交 给这个方法进行处理,这一过程称为捕获(catch)异常 。这是积极的异常处理机制。如果Java运行环境找不到可 以捕获异常的方法,则运行环境将终止,相应的Java程序 也将退出。 n(2)声明抛弃异常: n如果一个方法并不知道如何处理所出现的异常,则可在方 法声明时,声明抛弃(throws)异常。这是一种消极的异 常处理机制。 9.2.1捕获异常 n捕获异常是通过try-catch-finally语句实现的。 ntry n. ncatch( ExceptionName1 e ) n. ncatch( ExceptionName2 e ) n. n n. nfinally n. n n try n捕获异常的第一步是用try选定捕获异常的范 围,由try所限定的代码块中的语句在执行过程中 可能会生成异常对象并抛弃。 n catch n每个try代码块可以伴随一个或多个catch语句,用 于处理try代码块中所生成的异常事件。catch语句 只需要一个形式参数指明它所能够捕获的异常类 型,这个类必须是Throwable的子类,运行时系 统通过参数值把被抛弃的异常对象传递给catch块 。 n在catch块中是对异常对象进行处理的代码,与访问其它 对象一样,可以访问一个异常对象的变量或调用它的方法 。getMessage( )是类Throwable所提供的方法,用来得到 有关异常事件的信息,类Throwable还提供了方法 printStackTrace( )用来跟踪异常事件发生时执行堆栈的内 容。例如: ntry n . ncatch( FileNotFoundException e ) n System.out.println( e ); n System.out.println( message: +e.getMessage() ); n e.printStackTrace( System.out ); ncatch( IOException e ) n System.out.println( e ); n ncatch 语句的顺序: n捕获异常的顺序和catch语句的顺序有关,当 捕获到一个异常时,剩下的catch语句就不再 进行匹配。因此,在安排catch语句的顺序时 ,首先应该捕获最特殊的异常,然后再逐渐一 般化。也就是一般先安排子类,再安排父类。 n finally n捕获异常的最后一步是通过finally语句 为异常处理提供一个统一的出口,使 得在控制流转到程序的其它部分以前 ,能够对程序的状态作统一的管理。 不论在try代码块中是否发生了异常事 件,finally块中的语句都会被执行。 9.2.2声明抛弃异常 n1声明抛弃异常 n如果在一个方法中生成了一个异常, 但是这一方法并不确切地知道该如何 对这一异常事件进行处理,这时,一 个方法就应该声明抛弃异常,使得异 常对象可以从调用栈向后传播,直到 有合适的方法捕获它为止。 n2抛出异常 n抛出异常就是产生异常对象的过程,首先要生 成异常对象,异常或者由虚拟机生成,或者由 某些类的实例生成,也可以在程序中生成。在 方法中,抛出异常对象是通过throw语句实现 的。 9.3自定义异常类 n当Java内置的异常都不能明确的说明异常情况 的时候,开发人员往往需要定义一些异常类用 于描述自身程序中的异常信息,以区分其他程 序的异常信息。需要注意的是,唯一有用的就 是类型名这个信息,所以不要在异常类的设计 上花费精力。 实现自定义异常类的方法如下: n类java.lang.Throwable是所有异常类的基类,它包括两 个子类:Exception和Error,Exception类用于描述程序 能够捕获的异常,如ClassNotFoundException。Error 类用于指示合理的应用程序不应该试图捕获的严重问题 ,如虚拟机错误VirtualMachineError n自定义异常类必须是Throwable的直接或间接子类。自 定义异常类可以继承Throwable类或者Exception,而不 要继承Error类。自定义异常类之间也可以有继承关系 n需要为自定义异常类设计构造方法,以方便构造自定义 异常对象。 n注意:一个方法所声明抛弃的异常是 作为这个方法与外界交互的一部分而 存在的。所以,方法的调用者必须了 解这些异常,并确定如何正确的处理 他们。 9.3.1继承Exception类 【例9-3】继承Exception类。 public class MyFirstException extends Exception public MyFirstException() super(); public MyFirstException(String msg) super(msg); public MyFirstException(String msg, Throwable cause) super(msg, cause); public MyFirstException(Throwable cause) super(cause); n/自定义异常类的主要作用是区分异常 发生的位置,当用户遇到异常时,根 据异常名就可以知道哪里有异常,根 据异常提示信息进行修改。 9.3.2继承Throwable 类 【例9-4】继承Throwable 类。 public class MySecondException extends Throwable public MySecondException() super(); public MySecondException(String msg) super(msg); public MySecondException(String msg, Throwable cause) super(msg, cause); public MySecondException(Throwable cause) super(cause); 9.3.3自定义异常类的使用 【例9-5】自定义异常类的使用。 public class TestMyException public static void firstException() throws MyFirstException throw new MyFirstException( firstException() method occurs an exception!); public static void secondException() throws MySecondException throw new MySecondException( secondException() method occurs an exception!); public static void main(String args) try TestMyException.firstException(); TestMyException.secondException(); catch (MyFirstException e1) System.out.println(Except
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号