第6章异常处理 错误是编程中不可避免和必须要处理的问题。编程人 员和编程工具处理错误的能力在很大程度上影响着编 程工作的效率和质量。到目前为止,但前面章节里的 程序没有包含处理异常的代码。如果程序在运行过程 中发生了异常,那么系统就会以相应的错误消息终止 程序的执行。如果因为程序的错误或者某些外部因素 导致系统终止用户丢失数据,那程序就无法满足用户 的需求。在程序发生异常时,程序应该能做到:通知 用户程序出现了一个错误;保存全部工作;允许用户 安全地退出程序。 对于异常的情况,例如可能造成程序崩溃的错误输入, 3ava使用“异常处理”的错误捕获机制来进行处理
第6章 异常处理 错误是编程中不可避免和必须要处理的问题。编程人 员和编程工具处理错误的能力在很大程度上影响着编 程工作的效率和质量。到目前为止,但前面章节里的 程序没有包含处理异常的代码。如果程序在运行过程 中发生了异常,那么系统就会以相应的错误消息终止 程序的执行。如果因为程序的错误或者某些外部因素 导致系统终止用户丢失数据,那程序就无法满足用户 的需求。在程序发生异常时,程序应该能做到:通知 用户程序出现了一个错误;保存全部工作;允许用户 安全地退出程序。 对于异常的情况,例如可能造成程序崩溃的错误输入, Java使用“异常处理”的错误捕获机制来进行处理
本章要点 ■异常和异常类; 检查和非检查异常; ■异常处理 ■异常处理技巧; ■创建自己的异常类;
本章要点 ◼异常和异常类; ◼检查和非检查异常; ◼异常处理; ◼异常处理技巧; ◼创建自己的异常类;
61异常和异常类 异常是指发生在正常情况以外的事件,如用户输入错误、除数为零 需要的文件不存在、文件打不开、数组下标越界、内存不足等。程序在 运行过程中发生这样或那样的错误及异常是不可避免的。然而,一个好 的应用程序,除了应具备用户要求的功能外,还应具备能预见程序执行 过程中可能产生的各种异常的能力,并把处理异常的功能包括在客户程 序中。也就是说,我们在设计程序时,要充分考虑到各种意外情况,不 仅要保证应用程序的正确性,而且还应该具有较强的容错能力。这种对 异常情况给予恰当的处理技术就是异常处理 用任何一种程序设计语言的设计程序在运行时都可能出现各种意想不 到的事件或异常的情况,计算机系统对于异常的处理通常有两种方法 是计算机系统本身直接检测程序中的错误,遇到错误时终止程序运行 是由程序员在程序设计中加入处理异常的功能。它又可以进一步区分 为没有异常处理机制的程序设计语言中的异常处理和有异常处理机制的 程序设计语言中的异常处理两种
6.1 异常和异常类 异常是指发生在正常情况以外的事件,如用户输入错误、除数为零、 需要的文件不存在、文件打不开、数组下标越界、内存不足等。程序在 运行过程中发生这样或那样的错误及异常是不可避免的。然而,一个好 的应用程序,除了应具备用户要求的功能外,还应具备能预见程序执行 过程中可能产生的各种异常的能力,并把处理异常的功能包括在客户程 序中。也就是说,我们在设计程序时,要充分考虑到各种意外情况,不 仅要保证应用程序的正确性,而且还应该具有较强的容错能力。这种对 异常情况给予恰当的处理技术就是异常处理。 用任何一种程序设计语言的设计程序在运行时都可能出现各种意想不 到的事件或异常的情况,计算机系统对于异常的处理通常有两种方法: ◼一是计算机系统本身直接检测程序中的错误,遇到错误时终止程序运行。 ◼二是由程序员在程序设计中加入处理异常的功能。它又可以进一步区分 为没有异常处理机制的程序设计语言中的异常处理和有异常处理机制的 程序设计语言中的异常处理两种
61异常和异常类 Java语言的特色之一是异常处理机制( Exception hand‖ing)。Java语言 采用面向对象的异常处理机制。通过异常处理机制,可以预防错误的程 序代码或系统错误所造成的不可预期的结果发生,并且当这些不可预期 的错误发生时,异常处理机制会尝试恢复异常发生前的状态或对这些错 误结果做一些善后处理。通过异常处理机制,减少了编程人员的工作量, 增加了程序的灵活性,增强了程序的可读性和可靠性。 Java对异常的处理是面向对象的。在]ava中,预定义了很多异常类,每 个异常类都代表了相应的错误,当产生异常时,如果存在一个被异常类 与此异常相对应,系统将自动生成一个异常类对象。 所有的异常类都是从 Throwable类派生而来的。 Throwable类被包含在 java. lang包中,图XXX显示了Java异常类的层次结构
6.1 异常和异常类 Java语言的特色之一是异常处理机制(Exception Handling)。Java语言 采用面向对象的异常处理机制。通过异常处理机制,可以预防错误的程 序代码或系统错误所造成的不可预期的结果发生,并且当这些不可预期 的错误发生时,异常处理机制会尝试恢复异常发生前的状态或对这些错 误结果做一些善后处理。通过异常处理机制,减少了编程人员的工作量, 增加了程序的灵活性,增强了程序的可读性和可靠性。 Java对异常的处理是面向对象的。在Java中,预定义了很多异常类,每 个异常类都代表了相应的错误,当产生异常时,如果存在一个被异常类 与此异常相对应,系统将自动生成一个异常类对象。 所有的异常类都是从Throwable类派生而来的。Throwable类被包含在 java.lang包中,图XXX显示了Java异常类的层次结构
61异常和异常类 LinkageEror Ermor VirtualMachine Emor AWTEror Anthme tic Exception Throwable Runtime Exception IndexOutfBourds Exce ption Inte muptedE-xception Exception File Not FoundException 1OExcepbiom DOFEocepton AWTExcerdion
6.1 异常和异常类
61异常和异常类 Throwable类不能直接使用,在 Throwable类中定义了方法来检索与异常 相关的错误信息,并且打印显示异常发生的栈跟踪信息。它包含有两个 直接子类: Exception类和Eror类。 Eror类及其所有子类用来表示严重的运行错误,比如内存溢出,一般 无法在程序中进行恢复和处理。因此,我们不会用到它。 Exception类 及其所有子类定义了所有能够被程序恢复和处理的标准异常,在编程 中,我们要处理的异常主要是这一类。 Exception类拥有两个构造函数: public Exception();和 public Exception( String s)。其中第二个构造函 数中的字符串参数s表示对该异常的描述说明。 EXception类的所有子类又可以分成两种类别, RunT imeEXception异常 和其他异常。 RunTimeException异常表示异常产生的原因是程序中存 在错误所引起的。如数组下标越界、空对象引用,只要程序中不存在 错误,这类异常就不会产生。其他的异常不是由于程序错误引起的, 而是由于运行环境的异常、系统的不稳定等原因引起的。这一类异常 应该主动地去处理
6.1 异常和异常类 Throwable类不能直接使用,在Throwable类中定义了方法来检索与异常 相关的错误信息,并且打印显示异常发生的栈跟踪信息。它包含有两个 直接子类:Exception类和Error类。 Error类及其所有子类用来表示严重的运行错误,比如内存溢出,一般 无法在程序中进行恢复和处理。因此,我们不会用到它。Exception类 及其所有子类定义了所有能够被程序恢复和处理的标准异常,在编程 中,我们要处理的异常主要是这一类。Exception类拥有两个构造函数: public Exception();和public Exception(String s)。其中第二个构造函 数中的字符串参数s表示对该异常的描述说明。 Exception类的所有子类又可以分成两种类别,RunTimeException异常 和其他异常。RunTimeException异常表示异常产生的原因是程序中存 在错误所引起的。如数组下标越界、空对象引用,只要程序中不存在 错误,这类异常就不会产生。其他的异常不是由于程序错误引起的, 而是由于运行环境的异常、系统的不稳定等原因引起的。这一类异常 应该主动地去处理
62已检查和未检查的异常 Java语言规范将任何Eror的子类以及 RuntimeEXception的子类都称为未检查 ( unchecked)异常。而其他的异常都被称为已检查( checked)异常 在Java程序中,无论何时使用java.io包中类的输入或输出方法,我们都会使 用 throws IoException子句。如果没有在这些方法头中包括 throws子句,编译 器就将生成语法错误。但是,我们并不担心诸如被0除或者数组索引出界的情 况。如果在程序执行期间发生这些类型的错误,那程序以相应的错误消息终 止。对于这些类型的异常,我们无需在方法头中包括 throws子句。所以,在 程序中,哪些类型的异常需要在方法头中包括 throws子句呢? IOEXception是已检查异常,由于 System in read方法可能会引发 IOEXception 异常,因而抛出的是已检査异常。当编译器遇到这些方法调用时,会检查程 序是否处理 IOEXception,或通过抛出异常来报告。启用编译器检查类似 IOEXception或其他类型的已检查异常,可以帮助客户程序减少不能正确处理 的异常的数量。到目前为止,由于前面章节的程序不要求处理 IOEXception或 其他类型的已检査异常,所以程序通过抛出它们来声明检查异常
6.2 已检查和未检查的异常 Java语言规范将任何Error的子类以及RuntimeException的子类都称为未检查 (unchecked)异常。而其他的异常都被称为已检查(checked)异常。 在Java程序中,无论何时使用java.io包中类的输入或输出方法,我们都会使 用throws IOException子句。如果没有在这些方法头中包括throws子句,编译 器就将生成语法错误。但是,我们并不担心诸如被0除或者数组索引出界的情 况。如果在程序执行期间发生这些类型的错误,那程序以相应的错误消息终 止。对于这些类型的异常,我们无需在方法头中包括throws子句。所以,在 程序中,哪些类型的异常需要在方法头中包括throws子句呢? IOException是已检查异常,由于System.in.read方法可能会引发IOException 异常,因而抛出的是已检查异常。当编译器遇到这些方法调用时,会检查程 序是否处理IOException,或通过抛出异常来报告。启用编译器检查类似 IOException或其他类型的已检查异常,可以帮助客户程序减少不能正确处理 的异常的数量。到目前为止,由于前面章节的程序不要求处理IOException或 其他类型的已检查异常,所以程序通过抛出它们来声明检查异常
62已检查和未检查的异常 编译程序,当编译器或许无法确定是否发生诸如被0除或索引出界的异常时, 因此,这些类型的异常(未检査异常)不会被编译器检査出。于是,为了提 高程序的正确性,编程人员必须检査这些类型的异常 由于编译器不检查未检查异常,所以程序无须使用 throws子句声明它们,也 不需要在程序中提供代码来处理它们。属于 RuntimeEXception类的子类的异 常是未检査异常。如果程序中不提供代码处理未检査异常,那就由Java的默 认异常处理程序来处理异常 在方法头重, throws后面列出了方法可能抛出的各类异常。 throws子句的语 法是 throws ExceptionTypel, ExceptionType2 其中的 Exception type1, Exception Type2等都是异常类的名称。例如,考虑 下面的方法: public static void exception Methodo throws NumberFormatException, IOExceptiont//statements]
6.2 已检查和未检查的异常 编译程序,当编译器或许无法确定是否发生诸如被0除或索引出界的异常时, 因此,这些类型的异常(未检查异常)不会被编译器检查出。于是,为了提 高程序的正确性,编程人员必须检查这些类型的异常。 由于编译器不检查未检查异常,所以程序无须使用throws子句声明它们,也 不需要在程序中提供代码来处理它们。属于RuntimeException类的子类的异 常是未检查异常。如果程序中不提供代码处理未检查异常,那就由Java的默 认异常处理程序来处理异常。 在方法头重,throws后面列出了方法可能抛出的各类异常。throws 子句的语 法是: throws ExceptionType1,ExceptionType2… 其中的ExceptionType1,ExceptionType2等都是异常类的名称。例如,考虑 下面的方法: public static void exceptionMethod() throws NumberFormatException,IOException{ //statements}
63异常处理 Java语言的异常处理是通过try、 catch、 finally、thow和 throws语句来实现的
6.3 异常处理 Java语言的异常处理是通过try、catch、finally、throw和 throws语句来实现的
63异常处理— try-catch- finally语句 在大多数情况下,系统预设的异常处理方法只会输出一些简单的提示到控制 台上,然后结束程序的运行。这样的处理方式在许多情况下并不符合我们的 要求。为此,Java语言为我们提供了try- catch- finall语句,使用该语句可以 明确地捕捉到某种类型的异常,并按我们的要求加以适当的处理,这是充分 发挥异常处理机制的最佳方式。 try-catch- finally组合语句用来实现抛出异常和捕获异常的功能,其一般语法 格式如下:
6.3 异常处理—try-catch-finally语句 在大多数情况下,系统预设的异常处理方法只会输出一些简单的提示到控制 台上,然后结束程序的运行。这样的处理方式在许多情况下并不符合我们的 要求。为此,Java语言为我们提供了try-catch-finally语句,使用该语句可以 明确地捕捉到某种类型的异常,并按我们的要求加以适当的处理,这是充分 发挥异常处理机制的最佳方式。 try-catch-finally组合语句用来实现抛出异常和捕获异常的功能,其一般语法 格式如下: