编程红宝书(珍藏版) ava 完金自学手册 第11章Java异常处理 无论程序设计的如何巧妙,一旦达到一定的复杂程度难免会出现 错误。即使是简单的程序也难以避免。程序运行出错往往是没有 预料到这种情况,不知道如何处理。如果是经常出错、不健壮的 程序是没有人愿意使用的。甚至有的程序由于没有预料的某种错 误造成对运行环境的影响,甚至造成对计算机系统的影响更是让 人难以忍受。程序在运行中出现的难以预料的错误称为异常 ( Exception)。Java的异常处理机制就是尽最大努力,提供一套机 制保证程序在编写中方便的处理异常,使程序在运行阶段顺利处 理异常,从而使程序稳定、可靠地运行且不损伤运行系统 本章将讲解如何合理地处理异常来编写程序、异常处理的语法结 构,如何实现捕捉所有异常,以及很关键且极具威力的 finally子 句。总之通过本章的学习,读者应该养成良好的编写程序的习惯 尽力在程序的编写中处理可能出现的异常,使程序更健壮。但是 异常处理也不是包治百病的良药,它仅保证程序出错的机会尽量 减少,所以依然要求程序员严谨的程序设计,实现缜密的程序逻 辑。 Q想桃工业出隙社
第11章 Java异常处理 • 无论程序设计的如何巧妙,一旦达到一定的复杂程度难免会出现 错误。即使是简单的程序也难以避免。程序运行出错往往是没有 预料到这种情况,不知道如何处理。如果是经常出错、不健壮的 程序是没有人愿意使用的。甚至有的程序由于没有预料的某种错 误造成对运行环境的影响,甚至造成对计算机系统的影响更是让 人难以忍受。程序在运行中出现的难以预料的错误称为异常 (Exception)。Java的异常处理机制就是尽最大努力,提供一套机 制保证程序在编写中方便的处理异常,使程序在运行阶段顺利处 理异常,从而使程序稳定、可靠地运行且不损伤运行系统。 • 本章将讲解如何合理地处理异常来编写程序、异常处理的语法结 构,如何实现捕捉所有异常,以及很关键且极具威力的finally子 句。总之通过本章的学习,读者应该养成良好的编写程序的习惯, 尽力在程序的编写中处理可能出现的异常,使程序更健壮。但是 异常处理也不是包治百病的良药,它仅保证程序出错的机会尽量 减少,所以依然要求程序员严谨的程序设计,实现缜密的程序逻 辑
编程红宝书(珍藏版) ava 完金自学手 11.1理解异常 异常指意外发生的事情。异常的发生使程序不能继续执行 甚至在编译期程序无法完成编译,如程序员的语法错误就 是一种异常事件,这种异常是Java的默认异常,这类异常 也称为编译期异常,这点将在后面讲解。当然不是所有异 常在编译期都能得到处理,有的异常只有等到程序运行起 来才会发现,如用户点击一个按钮,调用一个对象执行网 络链接,但是由于不可预知的原因造成该对象没有初始化, 所以程序在这一点就无法继续执行,必须处理这个运行期 出现的异常问题。 讲到这里读者会发现,异常涉及几个关键元素,分别是异 常发生地点、异常类型、异常处理地点和异常处理函数 异常一旦发生,程序无法继续执行下去,程序必须知道在 哪个地点、什么方法或一段代码可以处理发生某种类型的 异常,也就是有处理该类型异常的代码段。直到该异常得 到处理。 Q想桃工业出隙社
11.1 理解异常 • 异常指意外发生的事情。异常的发生使程序不能继续执行。 甚至在编译期程序无法完成编译,如程序员的语法错误就 是一种异常事件,这种异常是Java的默认异常,这类异常 也称为编译期异常,这点将在后面讲解。当然不是所有异 常在编译期都能得到处理,有的异常只有等到程序运行起 来才会发现,如用户点击一个按钮,调用一个对象执行网 络链接,但是由于不可预知的原因造成该对象没有初始化, 所以程序在这一点就无法继续执行,必须处理这个运行期 出现的异常问题。 • 讲到这里读者会发现,异常涉及几个关键元素,分别是异 常发生地点、异常类型、异常处理地点和异常处理函数。 异常一旦发生,程序无法继续执行下去,程序必须知道在 哪个地点、什么方法或一段代码可以处理发生某种类型的 异常,也就是有处理该类型异常的代码段。直到该异常得 到处理
编程红宝书(珍藏版) ava 完金自学手 1.2异常示例 为了给读者一个直观的认识,在11.1节介绍的异常概念的基础上,给出 个运行期异常的例子。该程序中有除0错误,即两个整数相除,分母为0异 常,观察编译器的行为和执行该程序的结果。代码除0异常示例程序所示。 代码除0异常示例程序 1 public class ZeroException private int i=10; private int j=0 234567"89 private int r: private void getResulto i r=i/j System.out. println("i/j的计算结果是 public static void main(String[ args) 10 new ZeroExceptionO. getResulto Q想桃工业出隙社
11.2 异常示例 • 为了给读者一个直观的认识,在11.1节介绍的异常概念的基础上,给出一 个运行期异常的例子。该程序中有除0错误,即两个整数相除,分母为0异 常,观察编译器的行为和执行该程序的结果。代码除0异常示例程序所示。 • 代码 除0异常示例程序 • 1 public class ZeroException{ • 2 private int i = 10; • 3 private int j = 0; • 4 private int r; • 5 private void getResult(){ • 6 r = i/j; • 7 System.out.println("i/j 的计算结果是: "+r); • 8 } • 9 public static void main(String[] args){ • 10 new ZeroException().getResult(); • 11 } • 12 }
编程红宝书(珍藏版) ava 完金自学手 11.3Java异常处理 Java是面向对象的语言,所以在Java语言中万物皆对象、处处皆 对象。在异常处理中,所谓的异常在Java程序中就是一个异常对 象。而该对象可以是系统定义好的类对象,也可以是程序员自己 定义的异常类对象。总之这些异常都是对象。 在发生异常时,JWM会引发一系列行为。首先正如产生普通对象那 样在heap上创建一个异常对象,而该对象就是某个异常类的实例, 该类是Java类库或程序员已经定义好的,每一种异常类对应一种 情况的异常类型,类中可以包含该异常错误的相关信息和处理异 常的方法等内容,所以对于程序抛出的异常对象总有一个异常类 与之对象。一旦异常抛出,程序停止当前的执行代码,接着抛出 那个异常对象的引用,异常处理代码会接手该异常对象,如果找 到处理该异常类型的代码,则处理异常,否则程序将继续把该异 常抛向更外层的环境去处理,如果不能处理则最终交给操作系统, 从而终止该程序的运行。 对于异常处理Java提供了一定的语法结构。保证工作区段发生异 常能够被捕获,并得到适当地处理 Q想桃工业出隙社
11.3 Java异常处理 • Java是面向对象的语言,所以在Java语言中万物皆对象、处处皆 对象。在异常处理中,所谓的异常在Java程序中就是一个异常对 象。而该对象可以是系统定义好的类对象,也可以是程序员自己 定义的异常类对象。总之这些异常都是对象。 • 在发生异常时,JVM会引发一系列行为。首先正如产生普通对象那 样在heap上创建一个异常对象,而该对象就是某个异常类的实例, 该类是Java类库或程序员已经定义好的,每一种异常类对应一种 情况的异常类型,类中可以包含该异常错误的相关信息和处理异 常的方法等内容,所以对于程序抛出的异常对象总有一个异常类 与之对象。一旦异常抛出,程序停止当前的执行代码,接着抛出 那个异常对象的引用,异常处理代码会接手该异常对象,如果找 到处理该异常类型的代码,则处理异常,否则程序将继续把该异 常抛向更外层的环境去处理,如果不能处理则最终交给操作系统, 从而终止该程序的运行。 • 对于异常处理Java提供了一定的语法结构。保证工作区段发生异 常能够被捕获,并得到适当地处理
编程红宝书(珍藏版) ava 完金自学手 1.3.1try区块 Java的异常机制把工作代码和异常处理代码分割开,使程 序结构清晰。工作代码集中于用户需要解决的问题,而异 常处理代码则集中处理发生的异常事件。Try区块就是放置 可能产生异常的工作代码的区域。该区域也称为“警戒 区”,意思是这里面的程序代码可能发生问题,一旦发发 生问题则必须有相应的处理措施。使用try关键字设置代码 警戒区很简介,就是将工作代码放在try关键字后一个花括 号内,如下所示 try I 1234 //可能产生异常的代码1 //可能产生异常的代码2 Q想桃工业出隙社
11.3.1 try区块 • Java的异常机制把工作代码和异常处理代码分割开,使程 序结构清晰。工作代码集中于用户需要解决的问题,而异 常处理代码则集中处理发生的异常事件。Try区块就是放置 可能产生异常的工作代码的区域。该区域也称为“警戒 区”,意思是这里面的程序代码可能发生问题,一旦发发 生问题则必须有相应的处理措施。使用try关键字设置代码 警戒区很简介,就是将工作代码放在try关键字后一个花括 号{}内,如下所示。 • 1 try{ • 2 //可能产生异常的代码1; • 3 //可能产生异常的代码2; • 4 }
编程红宝书(珍藏版) ava 完金自学手 11.3.2 catch区块 catch区块是处理发生的异常。一旦程序发生异常则抛出该异常对象,则 在异常处理函数处得到处理,这个异常处理函数就是紧跟在try区块后的 catch区块。其语法格式如下所示。 try i 2 Threadthread= new My Thread o 4} catch(异常类型1对象1) 5 //处理异常类型1的代码 6 7} catch(异常类型2对象2){ 8 //处理异常类型2的代码 10} catch(异常类型3对象3){ //处理异常类型3的代码 13 14程序中其他代码 15 Q想桃工业出隙社
11.3.2 catch区块 • catch区块是处理发生的异常。一旦程序发生异常则抛出该异常对象,则 在异常处理函数处得到处理,这个异常处理函数就是紧跟在try区块后的 catch区块。其语法格式如下所示。 • 1 try{ • 2 Thread thread = new MyThread(); • 3 ………… • 4 }catch(异常类型1 对象1){ • 5 //处理异常类型1的代码 • 6 } • 7 }catch(异常类型2 对象2){ • 8 //处理异常类型2的代码 • 9 } • 10 }catch(异常类型3 对象3){ • 11 //处理异常类型3的代码 • 12 } • 13 ………… • 14 //程序中其他代码 • 15 …………
编程红宝书(珍藏版) ava 完金自学手 11.3.3Java异常规范 如果你设计的方法是给他人使用,并且该方法可能会抛出 几种异常,此时就必须理解Java的异常规定 ( specification)。同时对于使用Java类库中设计了异常 处理的各种方法也很有帮助。方法的设计者必须让使用者 知道你所设计的方法可能抛出怎样的异常类型。这样调用 者就知道如何捕捉这些可能的异常。在Java中提供了规范 的语法让方法的设计者告之用户方法可能抛出的异常,这 就是所谓的“异常规范”。它属于方法声明部分,在函数 的参数之后,通过关键字 throws皆可能引发异常类型实现。 所以这样设计的方法如下所刁 1 private void food throws Exeptionl, Exception2, Exception3 //函数主体 3 Q想桃工业出隙社
11.3.3 Java异常规范 • 如果你设计的方法是给他人使用,并且该方法可能会抛出 几种异常,此时就必须理解Java的异常规定 (specification)。同时对于使用Java类库中设计了异常 处理的各种方法也很有帮助。方法的设计者必须让使用者 知道你所设计的方法可能抛出怎样的异常类型。这样调用 者就知道如何捕捉这些可能的异常。在Java中提供了规范 的语法让方法的设计者告之用户方法可能抛出的异常,这 就是所谓的“异常规范”。它属于方法声明部分,在函数 的参数之后,通过关键字throws皆可能引发异常类型实现。 所以这样设计的方法如下所示。 • 1 private void foo() throws Exeption1,Exception2,Exception3{ • 2 //函数主体 • 3 }
编程红宝书(珍藏版) ava 完金自学手 =11.4 Throwable类及其子类 正如Java的所有对象都继承自0 bject一样,Java 的所有异常类都继承自类 Throwable, 该类定义了一些方法可以打印异常的描述信息, 本节将讲解 Throwable类的定义、构造及其各种获 得异常信息的方法。 Q想桃工业出隙社
11.4 Throwable类及其子类 • 正如Java的所有对象都继承自Object一样,Java 的所有异常类都继承自类Throwable, • 该类定义了一些方法可以打印异常的描述信息, 本节将讲解Throwable类的定义、构造及其各种获 得异常信息的方法
编程红宝书(珍藏版) ava 完金自学手 =11.4.1 Throwable类定义和方法 类 Throwable继承自 Object,Java所有的异常类都 继承 Throwable。读者可以查看Java的HTM文档看 到该类的定义和定义的方法,这里做简要介绍 该类的继承关系在标准文档中如图 Throwable类的 继承结构所示 java. lang Class Throwable java. lang Object java. lang. Throwable Throwable类的继承结构 Q想桃工业出隙社
11.4.1 Throwable类定义和方法 • 类Throwable继承自Object,Java所有的异常类都 继承Throwable。读者可以查看Java的HTML文档看 到该类的定义和定义的方法,这里做简要介绍。 该类的继承关系在标准文档中如图Throwable类的 继承结构所示
编程红宝书(珍藏版) ava 完金自学手 =11.4.2异常类的继承关系 Java所有的异常类都继承自 Throwable,该类有两个子类, 个是 Error,一个是 Exception。 Error类表示系统错误或 编译期错误,如语法错误、函数书写错误等,一般不用 不过这些错误我们经常遇到且可以操作的异常类是 Exception类,这类异常是Java标准函数库中抛出的基本异 常,或者是用户自定义的异常类,也可以是运行期发生的 异常事件,如对象引用为nul等 Java定义了众多的 Exception,以其子类的形式出现,这些 异常对应某一种数据操作类型错误,如 IOException就是和 输入输出相对应的异常, Classnotfoundexcetion和类转载 时的异常对应等。 Exception的子类在不同的jdk版本中数 量不同,但是功能模式是一样的。不同的异常类名称不同, 所捕获的异常有差异。对于每一个异常子类又有自己的子 类,以处理更详细的错误。对于 Throwable子类这里不做具 体的介绍,读者只要浏览一下Java文档就一目了然了。 Q 机械工业出版社 China Machine Press
11.4.2 异常类的继承关系 • Java所有的异常类都继承自Throwable,该类有两个子类, 一个是Error,一个是Exception。Error类表示系统错误或 编译期错误,如语法错误、函数书写错误等,一般不用。 不过这些错误我们经常遇到且可以操作的异常类是 Exception类,这类异常是Java标准函数库中抛出的基本异 常,或者是用户自定义的异常类,也可以是运行期发生的 异常事件,如对象引用为null等。 • Java定义了众多的Exception,以其子类的形式出现,这些 异常对应某一种数据操作类型错误,如IOException就是和 输入输出相对应的异常,ClassNotFoundExcetion和类转载 时的异常对应等。Exception的子类在不同的jdk版本中数 量不同,但是功能模式是一样的。不同的异常类名称不同, 所捕获的异常有差异。对于每一个异常子类又有自己的子 类,以处理更详细的错误。对于Throwable子类这里不做具 体的介绍,读者只要浏览一下Java文档就一目了然了