Java语言程序设计教程-雷学生-电子教案 第07章

上传人:E**** 文档编号:89390356 上传时间:2019-05-24 格式:PPT 页数:16 大小:369.50KB
返回 下载 相关 举报
Java语言程序设计教程-雷学生-电子教案 第07章_第1页
第1页 / 共16页
Java语言程序设计教程-雷学生-电子教案 第07章_第2页
第2页 / 共16页
Java语言程序设计教程-雷学生-电子教案 第07章_第3页
第3页 / 共16页
Java语言程序设计教程-雷学生-电子教案 第07章_第4页
第4页 / 共16页
Java语言程序设计教程-雷学生-电子教案 第07章_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Java语言程序设计教程-雷学生-电子教案 第07章》由会员分享,可在线阅读,更多相关《Java语言程序设计教程-雷学生-电子教案 第07章(16页珍藏版)》请在金锄头文库上搜索。

1、第7章 异常处理,异常是指程序在运行过程中的不正常情况。在不支持异常处理的计算机语言中,错误必须被手工检查和处理,这种方法既笨拙又麻烦。Java的异常处理机制则避免了这些问题,而且在处理过程中,把对运行时错误的处理以面向对象的方式解决。,7.1 异常处理基础 7.2 try和catch语句 7.3 异常抛出 7.4 finally语句 7.5 自定义异常类,Return,7.1 异常处理基础,本节介绍Java中有关异常处理的基础知识,包括异常的概念、异常的类型、Java的内置异常等方面的内容。,7.1.1 关于异常处理 7.1.2 异常的类型 7.1.3 Java的内置异常 7.1.4 未被捕

2、获的异常,Return,7.1.1 关于异常处理,异常指的是程序运行时出现的非正常情况,也称为“例外”。在用传统的语言编程时,程序员只能通过函数的返回值来发出错误信息,这易于导致很多错误。Java对异常的处理是面向对象的。一个Java的Exception是一个描述异常情况的对象。当出现异常情况时,一个Exception对象就产生了,并放到产生这个“异常”的成员函数里。 Java异常(Exception)用于描述在代码段中发生的异常。当异常情况发生,一个代表该异常的对象被创建并在导致该错误的方法中被引发(throw)。该方法可以选择自己处理异常或传递该异常。两种情况下,该异常被捕获(caught

3、)并处理。异常可能是由Java运行时系统产生,或者是由手工代码产生。被Java引发的异常与违反语言规范或超出Java执行环境限制的基本错误有关。手工编码产生的异常基本上用于报告方法调用程序的出错状况。 Java中的异常处理通过5个关键字进行控制:try、catch、throw、throws和 finally。下面是异常处理块的一般形式:,Return,try / block of code to monitor for errors catch (ExceptionType1 exOb) / exception handler for ExceptionType1 catch (Excepti

4、onType2 exOb) / exception handler for ExceptionType2 / . finally / block of code to be executed before try block ends 其中,ExceptionType 是发生异常的类型。,7.1.2 异常的类型,在“异常”类层次的最上层有一个单独的类叫做Throwable。这个类用来表示所有的异常情况。每个异常类型都是Throwable的子类。Throwable有两个直接的子类。一类是Exception,是用户程序能够捕捉到的异常情况。我们可通过产生它的子类来创建自己的异常。另一类是Error

5、,它定义了那些通常无法捕捉到的“异常”。一般说来要谨慎使用Error子类,因为它们通常会导致灾难性的失败。在Exception中有一个子类RuntimeException,它是程序运行时自动地对某些错误作出反应而产生的。 另一类分支由Error作为顶层,Error定义了在通常环境下不希望被程序捕获的异常。Error类型的异常用于Java运行时系统来显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一例。本章将不讨论关于Error类型的异常处理,因为它们通常是灾难性的致命错误,不是你的程序可以随意控制的。教材P175页图7-1显示了异常和错误的继承层次关系。,Return,7.1.3 Java

6、的内置异常,在标准包java.lang中,Java定义了若干个异常类。前面的例子曾用到其中一些。这些异常一般是标准类RuntimeException的子类。因为java.lang实际上被所有的Java程序引入,多数从RuntimeException派生的异常都自动可用。而且,它们不需要被包含在任何方法的throws列表中。Java语言中,这被叫做未经检查的异常(unchecked exceptions )。因为编译器不检查它是否处理或引发了这些异常。 java.lang中定义的未经检查的异常见教材P175页表7-1中所列。 教材P176页表7-2中列出了由 java.lang定义的必须在方法的

7、throws列表中包括的异常,这些方法能产生其中的某个异常但是不能自己处理它,叫作受检查异常(checked exceptions)。Java定义了几种与不同类库相关的异常类型。,Return,7.1.4 未被捕获的异常,在学习如何处理程序中的异常之前,让我们看一下如果不处理它们,将会有什么样的情况发生。下面的小程序包括一个故意导致被零除错误的表达式 class Exc0 public static void main(String args) int d = 0; int a = 42 / d; 当Java运行时系统检查到被零除的情况,它构造一个新的异常对象然后引发该异常。这导致Exc0的执

8、行停止,因为一旦一个异常被引发,它必须被一个异常处理程序捕获并且被立即处理。该例中,我们没有提供任何我们自己的异常处理程序,所以异常被Java运行时系统的默认处理程序捕获。任何不是被你程序捕获的异常最终都会被该默认处理程序处理。默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序。,Return,下面是由标准javaJDK运行时解释器执行该程序所产生的输出: java.lang.ArithmeticException: / by zero at Exc0.main(Exc0.java:5) 其中,需要注意类名Exc0、方法名main、文件名Exc0.java和行数5是怎样

9、被包括在一个简单的堆栈使用轨迹中的。还有,注意引发的异常类型是Exception的一个名为ArithmeticException的子类,该子类更明确地描述了是何种类型的错误方法。本章后面将讨论Java提供的多个内置的与可能产生的不同种类运行时错误相匹配的异常类型。堆栈轨迹将显示导致错误产生的方法调用序列。,7.2 try和catch语句,尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常是希望自己处理异常。这样做有两个好处:第一,它允许你修正错误。第二,它防止程序自动终止。本节将介绍相应的方法。,7.2.1 try和catch的使用 7.2.2 显示一个异常的描述 7.2

10、.3 使用多重catch语句 7.2.4 嵌套try语句,Return,7.2.1 try和catch的使用,为防止和处理一个运行时错误,只需要把所要监控的代码放进一个try块就可以了。紧跟着try块的,包括一个说明你所希望捕获的错误类型的catch子句。完成这个任务的方法很简单,下面的程序包含一个处理因为被零除而产生的ArithmeticException 异常的try块和一个catch子句。 class Exc2 public static void main(String args) int d, a; try / monitor a block of code. d = 0; a =

11、42 / d; System.out.println(“This will not be printed.“); catch (ArithmeticException e)/catch divide-by-zero error System.out.println(“Division by zero.“); System.out.println(“After catch statement.“); ,Return,7.2.2 显示一个异常的描述,Throwable重载toString()方法(由Object定义),它返回一个包含异常描述的字符串。可以通过在println()中传给异常一个参数来

12、显示该异常的描述。例如,前面程序的catch块可以被重写成: catch (ArithmeticException e) System.out.println(“Exception: “ + e); a = 0; / set a to zero and continue 当这个版本代替原程序中的版本,程序在标准javaJDK解释器下运行,每一个被零除错误显示下面的消息 Exception: java.lang.ArithmeticException: / by zero 尽管在上下文中没有特殊的值,显示一个异常描述的能力在其他情况下是很有价值的,特别是当对异常进行测试和调试时。,Return,

13、7.2.3 使用多重catch语句,某些情况,由单个代码段可能引起多个异常。处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常。当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行。当一个catch语句执行以后,其他的子句被旁路,执行从try/catch块以后的代码开始继续。 当用多个catch语句时,需要记住异常子类必须在它们任何父类之前使用,这一点是很重要的。因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,如果子类在父类后面,子类将永远不会到达。而且,Java中不能到达的代码是一个错误。,Return,7.2.4 嵌

14、套try语句,在进行异常处理时,try语句可以被嵌套使用。也就是说,一个try语句可以在另一个try块内部。每次进入try语句,异常的前后关系都会被推入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。这个过程将继续直到一个catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。如果没有catch语句匹配,Java在运行时系统将处理这个异常。教材P180181页给出了一个运用嵌套try语句的具体例子。,Return,7.3 异常抛出,前面只是说明了如何获取Java运行时被系统引发的异常。同时,程序还可以

15、用throw语句引发明确的异常,用throws语句来标明一个成员函数可能抛出的各种异常。本节将对这方面的内容进行介绍。,7.3.1 throw语句 7.3.2 throws语句,Return,7.3.1 throw语句,使用throw语句可以明确地抛出一个“异常”。首先,必须得到一个Throwable的实例的控制柄,通过参数传到catch子句,或者用new操作符来创建一个。下面是throw语句的一般使用形式: throw ThrowableInstance; 这里,ThrowableInstance一定是Throwable类类型或Throwable子类类型的一个对象。简单类型,例如int或ch

16、ar,以及非Throwable类,例如String或Object,不能用作异常。有两种可以获得Throwable对象的方法:在catch子句中使用参数或者用new操作符创建。 程序执行在throw语句之后立即停止,后面的任何语句不被执行。最紧紧包围的try块用来检查它是否含有一个与异常类型匹配的catch语句。如果发现了匹配的块,控制将转向该语句;如果没有发现,次包围的try块来检查,以此类推。如果没有发现匹配的catch块,默认异常处理程序中断程序的执行并且打印堆栈轨迹。,Return,7.3.2 throws语句,如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常。做到这点你可以在方法声明中包含一个throws子句。一个throws子句列举了一个方法可能引发的所有异常类型。这对于除Error 或RuntimeException及它们子类以外类型的所有异常是必要的。一个方法

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号