第8章 异常与调试.ppt_第1页
第8章 异常与调试.ppt_第2页
第8章 异常与调试.ppt_第3页
第8章 异常与调试.ppt_第4页
第8章 异常与调试.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第八章 异常与调试,广东工业大学计算机学院,广东工业大学计算机学院,2,引言,当出现错误时,应用程序至少应该承担下列义务: 向用户通告错误 保存所有的操作结果 允许用户以适当的形式退出程序 对于异常情况,Java使用异常处理(exception handling)的错误捕获机制来处理。,广东工业大学计算机学院,3,本章内容,8.1 异常的基本概念 8.2 异常处理机制 8.3 抛出异常 8.4 捕获异常 8.5 记录日志 8.6 断言,广东工业大学计算机学院,4,异常的基本概念,异常是在程序运行过程中发生的异常事件。 例如:除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运

2、行。程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。 C语言中,通过使用if语句来判断是否出现了异常并进行处理。但是,这种错误处理机制并不够完善。 例: main() int a, b, c; scanf(“%d%d”, ,广东工业大学计算机学院,5,需要考察的错误类型,那些错误类型是程序员需要考虑的? 1. 用户输入错误。 例如输入了不正确的URL 2. 设备错误 例如需要打印时,打印机没有接通电源 3. 物理限制 例如磁盘可用空间已满 4. 代码错误 例如使用了一个无效的数组下标,广东工业大学计算机学院,6,本章内容,8.1 异常的基本概念 8.2 异常处理机制 8.3 抛出异常

3、 8.4 捕获异常 8.5 记录日志 8.6 断言,广东工业大学计算机学院,7,异常处理机制,Java通过面向对象的方法来处理异常。 异常处理机制:在一个方法的运行过程中,如果发生了异常,则这个方法生成一个代表该异常的对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理此异常。 有两种处理异常的方式: 1. 抛出异常:把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。 2. 捕获异常:运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回朔,直到找到包含相应异常处理的方法为止,这一个过程称为捕获(catch)一个异常。,广东工业大学计算机学院,8,本章内容,8

4、.1 异常的基本概念 8.2 异常处理机制 8.3 抛出异常 8.4 捕获异常 8.5 记录日志 8.6 断言,广东工业大学计算机学院,9,Throwable类及其子类,要用面向对象的方法处理异常,就必须建立类的层次。类 Throwable位于这一类层次的最顶层,只有它的子类对象才可以作为一个异常被抛出。,Java中的异常层次结构,广东工业大学计算机学院,10,异常层次结构的分支,Error类对象:如动态链接错误等,由Java虚拟机生成并抛出。通常的Java应用程序不处理这类异常。 2. Exception类对象是Java程序处理或抛出的对象。它有各种不同的子类分别对应于不同类型的异常。 (1

5、) RunTimeException类及其子类:Java程序在运行时产生的异常,例如被0除、数组下标越界、访问空引用。 派生自RunTimeException或者Error的异常称为“未检查(unchecked)异常” (2) 除此(RunTimeException)之外:其他的异常类必须被捕获或被重新抛出,否则编译会错误。 其它异常称作“已检查(checked)异常”,广东工业大学计算机学院,11,运行时异常,运行时异常(RuntimeException)是由Java运行时系统在程序的运行过程中检测到的。 它可能在程序的任意部位发生,而且其数量可能很大,因此系统允许程序不对它进行处理。 这时

6、,Java运行时系统会把生成的运行时异常对象交给缺省的异常处理程序,在标准输出上显示异常的内容以及发生异常的位置。 “如果出现运行时异常,则一定是你的问题”。,广东工业大学计算机学院,12,声明已检查异常,如果程序遇到了无法处理的情况,Java方法可以抛出一个异常,即告诉编译器可能会发生什么错误。 例如:试图处理文件信息的代码就有义务通告编译器,可能会抛出IOException类型的异常。 方法应该在其首部声明可能抛出的异常。 public FileInputStream(String name) throws FileNotFoundException 这个构造器声明表示: 在正常情况下,构

7、造器根据给定的String参数构造一个FileInputStream对象; 在异常情况下,构造器会抛出一个FileNotFoundException异常对象。,广东工业大学计算机学院,13,需要抛出异常的情况,编写一个方法时,不必将所有可能抛出的对象都做声明。在以下4种情况时才会抛出异常: 1. 调用一个可能会抛出已检查异常的方法,例如上面提到的FileInputStream构造器。 2. 程序运行过程中发现错误,并且利用throw子句抛出一个已检查异常。 3. 程序错误。例如代码:a-1 = 0;会抛出ArrayIndexOutOfBoundsException异常 4. Java虚拟机和运

8、行时库出现的内部异常。 只有对于情况1和情况2,被调用的方法必须明确抛出异常。如果没有处理器捕获这几种异常,当前执行的线程就会被中断。,广东工业大学计算机学院,14,示例:抛出异常的代码,class MyAnimation . . . public Image loadImage(String s) throws EOFException, MalformedURLException . . . 但不要声明Java的内部错误,即从Error类继承的那些异常。,广东工业大学计算机学院,15,几点注意,1. 在子类方法中声明的已检查异常不能超过父类方法中声明的异常范围。即: (1) 在子类方法中抛

9、出的异常范围更小,或者根本不抛出异常。 (2) 如果父类没有抛出异常,则子类也不能抛出任何已检查异常。 2. 与C+的区别: (1) C+编译器不处理任何异常,仅在运行时抛出异常;Java编译器可能会在编译时抛出异常。 (2) 在C+中,没有thow说明的函数也可以抛出任何异常;在Java中,没有throws说明符的方法不能抛出任何已检查异常。,广东工业大学计算机学院,16,如何抛出异常,对于一个已经存在的异常类,将其对象抛出是非常容易的: 1. 找到合适的异常类 2. 创建这个类的一个对象 3. 使用throw子句将其抛出 举例: String readData(Scanner in) th

10、rows EOFException . . . while (. . .) if (!in.hasNext() / EOF encountered if (n len) throw new EOFException(); . . . return s; readData()方法试图读取一个文件,所以有可能会遇到“文件读取异常结束”的情况,对应现成的异常类是EOFException,只需要将其对象抛出即可。,广东工业大学计算机学院,17,创建异常类,当遇到任何标准异常类都不能恰当地描述当前问题时,需要自定义异常类。 自定义的异常类从Exception类或者其子类中派生。习惯上,自定义异常类有两个

11、构造器: 一个是默认的构造器; 一个是带有详细描述信息的构造器。 class FileFormatException extends IOException public FileFormatException() public FileFormatException(String gripe) super(gripe); ,广东工业大学计算机学院,18,创建异常类(续),创建一个自定义的异常类,之后就可以像Java API提供的异常类那样使用: class FileFormatException extends IOException - String readData(BufferedRe

12、ader in) throws FileFormatException . . . while (. . .) if (ch = -1) / EOF encountered if (n len) throw new FileFormatException(); . . . return s; ,广东工业大学计算机学院,19,本章内容,8.1 异常的基本概念 8.2 异常处理机制 8.3 抛出异常 8.4 捕获异常 8.5 记录日志 8.6 断言,广东工业大学计算机学院,20,捕获异常,try catch - finally语句:捕获一个或多个异常,语法结构如下: try 可能产生异常的代码段;

13、 catch(异常类名1 对象名1) 处理语句组1; catch(异常类名2 对象名2) 处理语句组2; finally 最终处理语句; ,广东工业大学计算机学院,21,1. try子句,Try子句用花括号指定了一段代码,该段代码可能会抛出一个或多个异常,同时,该段代码也指定了它后面的catch语句所捕获的异常的范围。 例如: try int a = 1, 2, 3, 4, 5; int sum = 0; for(int i = 0; i = 5; i+) sum = sum + ai; System.out.println(sum); 这段代码可能产生引用了“超出数组下标”的错误,应用捕捉对

14、应的ArrayIndexOutOfBoundsException对象。,广东工业大学计算机学院,22,2. catch子句,Catch子句的参数类似于方法的声明,包括一个异常类型和一个异常对象。 Catch(异常类名1 对象名1) 处理语句组1; 异常类型必须为Throwable类的子类,它指明了catch语句所处理的异常类型。 异常对象由运行时系统在try所指定的代码块中生成并被捕获,处理语句组1;中包含异常对象的处理,必要时可以调用异常对象的方法。,广东工业大学计算机学院,23,2. catch子句(续),Catch子句可以有多个,分别处理不同类型的异常。 捕获一个异常对象后,Java r

15、untime system从上到下分别对每个catch语句处理的异常类型进行检测,直到找到与异常对象类型相匹配的catch语句为止。 类型匹配:catch所处理的异常类型与生成的异常对象的类型(或者是它的父类)完全一致,因此,catch语句的排列顺序应该是从特殊到一般。 也可以用一个catch子句处理多个异常类型,这时它的异常类型参数应该是多个异常类型的父类。,广东工业大学计算机学院,24,3. finally子句,Try子句所限定的代码中,当在某一行抛出一个异常时,这一行后面的代码不会被执行。,而是转去与该异常匹配的catch子句执行。 通过finally子句可以指定一个代码块,它指定的代码

16、必须被执行。 即无论try所指定的程序块中是否产生异常,也无论catch子句的异常类型是否与所抛出的异常的类型一致。 作用:finally为异常捕获语句提供了统一的出口。 通常在finally子句中可以进行资源的清除工作。如关闭打开的文件,释放一个锁对象等。,广东工业大学计算机学院,25,捕获异常的程序流程总结,由上面可知,捕获异常的程序流程总结如下: 1. 程序执行try中的代码。 2. 如果抛出一个异常,则执行catch中的语句;如果没有抛出异常,则跳过catch语句。 3.执行finally中的代码。,广东工业大学计算机学院,26,异常处理机制的优点,1. Java通过面向对象的方法进行

17、异常处理,把各种不同的异常事件进行分类。 这种机制对于具有动态运行特性的复杂程序提供了有效的控制方式。 2. Java的异常处理机制使得处理异常的代码和“常规”代码分开,减少了代码的数量,增强了程序的可读性。 可以比较一下C语言中用if语句来处理异常的情形,这时需要进行一系列条件的判定。,广东工业大学计算机学院,27,异常处理机制的优点(续),3. Java的异常处理机制使得异常事件可以沿调用栈自动向上传播,而不是C语言中通过函数的返回值来传播。 可以传递更完善的信息并且简化代码的编写。 4. 把异常事件作为对象来处理,利用类的层次性既可以把多个具有相同父类的异常统一处理,也可以区分不同的异常

18、分别处理,使用非常灵活。,广东工业大学计算机学院,28,异常处理机制的使用原则,1. 对非运行时异常必须捕获或声明抛出,而对运行时异常则不必,可以交给Java运行时系统来处理。 2.对于自定义的异常类,通常把它作为类Exception子类,而不作为类Error的子类。 (1)因为Error类通常用于系统内严重的硬件错误。并且在多数情况下,不要把自定义的异常类作为运行时异常类RuntimeException子类。 (2)另外,自定义异常类的类名常常以Exception结尾。,广东工业大学计算机学院,29,异常处理机制的使用原则(续),3. 在捕获或声明异常时,要选取合适类型的异常类,根据不同的情

19、况使用一般或特殊的异常类。 4. 根据具体的情况选择在何处处理异常。 是在方法内捕获并处理呢? 还是用throws子句把它交给调用栈中上层的方法去处理? 5. 使用finally语句为异常处理提供统一的出口。,广东工业大学计算机学院,30,示例:Java错误与异常处理,示例有意制造了几种不同的异常,下图显示了捕获的各种异常。,NB演示ExceptTest,注意: 1. 浮点运算(如除0.0或者计算-1的平方)不会产生异常,而是得到“无穷大”和“非法数值”的特殊值。 2. 如果点击“Throw unknown”按钮,将会抛出一个UnknownError对象,这个类不是Exception的子类,因

20、此程序不会捕获它,而会在控制台上打印错误信息和堆栈跟踪的情况。,广东工业大学计算机学院,31,本章内容,8.1 异常的基本概念 8.2 异常处理机制 8.3 抛出异常 8.4 捕获异常 8.5 记录日志 8.6 断言,广东工业大学计算机学院,32,记录日志的作用,在调试程序的时候,很多Java程序员都试图在有问题的代码插入一些调用System.out.println方法的语句,来帮助观察程序运行的过程。 在调试完毕后,这些语句需要程序员手工移除,使用起来并不便捷。 自JDK1.4之后,Java API提供了java.util.logging包来解决这个问题。,广东工业大学计算机学院,33,基本

21、日志的使用,日志系统管理着一个名为Logger.global的默认日志管理器,并可以通过info方法记录日志信息: Logger myLogger = Logger.getLogger(com.mycompany.myapp); 在默认情况下,这条记录会显示如下所示的内容: May 10, 2004 10:12:15 PM LoggingImageViewer fileOpen INFO: File-Open menu item selected 输出结果中自动包含了时间、调用的类名和方法名。 取消所有的日志,只需要在恰当的地方(比如在main方法的开头)调用: Logger.gloabal.

22、setLevel(Level.OFF);,广东工业大学计算机学院,34,gif文件装载器,一个可以装载.gif文件的程序。使用logger记录每一次操作的相关信息,及其方法调用路径。,NB演示LoggingImageViewer,广东工业大学计算机学院,35,java.util.logging包的作用,与简陋的System.out.println输出语句相比,logging包具有明显的优势: 1. 可以取消全部或者某个级别的日志,而且开启和关闭操作也很容易。 2.可以很简单地禁止日志的输出,因此将日志代码“遗留”在程序中的代价很小。 3. 日志记录可以被定向到不同的处理器,用于在控制台中显示、文本存储等。 4. 日志记录可以采用不同的方式来格式化,如纯文本或XML。 5. 应用程序可以使用多个日志记录器,它们使用类似包名层次结构的名字,如com.gdut.myapp 6. 默认情况下日志系统由配置文件控制,如果有需要,应用程序可以替换这个配置。,广东工业大学计算机学院,36,本章内容,8.1 异常的基本概念 8.2 异常处理机制 8.3 抛出异常 8.4 捕获异常 8.5 记录日志 8.6 断言,广东工业大学计算机学院,37,断言的作用,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论