![《JAVA语言程序设计教程》课件第7章_第1页](http://file4.renrendoc.com/view14/M05/1B/27/wKhkGWdScvqAMQy6AAOFov3njOc276.jpg)
![《JAVA语言程序设计教程》课件第7章_第2页](http://file4.renrendoc.com/view14/M05/1B/27/wKhkGWdScvqAMQy6AAOFov3njOc2762.jpg)
![《JAVA语言程序设计教程》课件第7章_第3页](http://file4.renrendoc.com/view14/M05/1B/27/wKhkGWdScvqAMQy6AAOFov3njOc2763.jpg)
![《JAVA语言程序设计教程》课件第7章_第4页](http://file4.renrendoc.com/view14/M05/1B/27/wKhkGWdScvqAMQy6AAOFov3njOc2764.jpg)
![《JAVA语言程序设计教程》课件第7章_第5页](http://file4.renrendoc.com/view14/M05/1B/27/wKhkGWdScvqAMQy6AAOFov3njOc2765.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章Java异常处理7.1异常处理概述7.2异常处理机制7.3finally子句7.4自定义异常
7.1异常处理概述
编写一个Java程序,打开本地磁盘下的D:\test.txt文件。编译代码时的显示结果如图7.1所示。
由编译信息可知,以上程序将产生FileNotFoundException异常。因此,若希望程序正确运行,编译器需能够处理FileNotFoundException异常。图7.1例7-1的运行结果7.1.1异常处理基础
异常即程序运行过程中发生的异常事件,如例7-1所描述。程序运行时出现异常则生成异常对象,生成的异常对象被交给Java虚拟机,Java虚拟机寻找相应的代码来处理这一异常。生成异常对象并把它交给Java虚拟机的过程称为抛出(throw)异常。在Java虚拟机得到一个异常对象后,它将会寻找处理这一异常的代码。寻找异常处理方法的过程从生成异常的方法开始,沿着方法的调用栈逐层回朔,直到找到包含相应异常处理的方法为止。然后,Java虚拟机把当前异常对象交给这个方法进行处理。这一过程称为捕获(catch)异常。如果查遍整个调用栈仍然没有找到合适的异常处理方法,Java虚拟机将终止Java程序的执行。
Java异常处理过程通过5个关键字控制:try、catch、finally、throw和throws。其中,try、catch和finally构成异常处理的完整语法。
try{
//异常监控区域代码块
}
catch(ExceptionTypee){
//ExceptionType类型异常处理
}
finally{
//方法返回前需执行的代码块
}
try语句块表示要尝试运行的代码块,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。
catch语句块会捕获try代码块中发生的异常,并在其代码块中做异常处理。catch语句带一个Throwable类型的参数,表示可捕获的异常类型。当try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配,若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对象。catch语句可以有多个,用来匹配多个异常。某个异常与catch块一旦匹配成功,就不再尝试匹配别的catch块了。通过异常对象可以获取异常发生时完整的Java虚拟机堆栈信息,以及异常信息和异常发生的原因等。
finally语句块是紧跟在catch语句后的语句块,不管try语句块是否发生异常该语句块总会被执行。finally语句块总是在方法返回前执行,目的是给程序一个补救的机会。这也体现了Java语言的健壮性。
throw和throws的用法描述如下。
publicstaticvoidtest()throwsException{
//抛出一个检查异常
thrownewException(“方法test中的Exception”);
}
throw关键字用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明,方法可能抛出的异常类型。该方法的调用者也必须检查和处理抛出的异常。如果所有方法都层层上抛获取的异常,最终Java虚拟机会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。7.1.2异常的分类
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在JavaAPI中已经定义了许多异常类,这些异常类分为两大类:错误(Error)和异常(Exception)。Java异常体系结构呈树状,其层次结构如图7.2所示。图7.2Java异常体系结构所有异常类型都是内置类Throwable的子类,因此,Throwable在异常类层次结构的顶层。Thorwable类有两个子类Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(UncheckedException)和检查异常(CheckedException)。下面将详细讲述这些异常之间的区别与联系。
1.Error与Exception类
Error类是错误类,表示仅靠程序本身无法修复的严重错误,如内存溢出错误(OutOfMemoryError)、线程死亡错误(ThreadDeath)等。这类异常发生时,Error类对象由Java虚拟机生成并抛出给系统。本章不再讨论关于Error类型的异常处理,因为它们通常是灾难性的致命错误,不是程序可以控制的。
Exception类是异常类,表示程序本身可以处理的异常。它从父类Throwable中继承了成员变量和成员方法,只在自身类中声明了一些构造方法。程序中的每一个异常对应于Exception类的一个子类实例,异常对象中包含异常的位置和特征信息。这种异常分两大类:运行时异常和非运行时异常。程序应当尽可能去处理这些异常。
2.运行时异常和非运行时异常
运行时异常都是RuntimeException类及其子类异常,如空对象异常(NullPointerException)、算术异常(ArithmeticException)、类型强制转换异常(ClassCastException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、数值格式异常(NumberFormatException)等。这些异常是不检查异常,程序可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类,如IOException、SQLException等。这些异常是检查异常,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能通过编译。一般情况下不自定义检查异常。7.1.3异常的描述
异常类Exception的超类为Throwable类。Throwable类中定义了方法来检索与异常相关的信息,并打印显示异常发生的栈跟踪信息。这些方法的描述见表7.1。程序运行结果如图7.3所示。图7.3例7-2的运行结果显然,printStackTrace()方法可获得比getMessage()方法更多的信息。
7.2异常处理机制
7.2.1捕获和处理异常
尽管Java运行时由系统提供的默认异常处理程序对于调试很有用,但程序员通常都希望能手动处理异常。这样做有两个好处。第一,允许修正错误。第二,防止程序自动终止。但Java异常的捕获和处理是一件不容易把握的事情,如果处理不当,不但会让程序的可读性大大降低,而且导致系统性能低下,甚至引发一些难以发现的错误。为防止和处理一个运行时错误,只需要把所要监控的代码放进一个try语句块。紧跟try语句块的是一个能够捕获程序员所希望的错误类型的catch语句块。下面的程序包含一个处理例7-1中FileNotFoundException异常的try语句块和catch语句块。图7.4例7-3的运行结果注意在异常发生时,try语句块中的“System.out.println("Afteropening");”语句是不会被执行的。一旦异常被引发,程序控制由try语句块转到catch语句块,而不会从catch语句块返回到try语句块。一旦执行了catch语句,程序控制从整个try/catch块的下面一行继续。一个try语句块和它的catch语句块形成了一个单元,try语句块不能单独使用。一个catch语句块的范围受限于前面所定义的try语句块,它不能捕获另一个try语句块声明所引发的异常。catch语句的参数类似于方法的声明,包括一个异常类型和一个异常对象。异常类型必须为Throwable类的子类,它指明了catch语句所处理的异常类型。异常对象在try语句块中生成并被捕获,异常对象名可以是任意标识符,但通常用小写字母e作为异常对象名,表示异常对象。某些情况下,单个代码段可能引发多个异常。处理这种情况,需要定义两个或更多的catch语句块,每个语句块捕获一种类型的异常。当异常被引发时,Java虚拟机从上到下将当前异常对象的类型和每个catch语句处理的异常类型进行比较,直到找到最匹配的catch语句为止。当一个catch语句执行以后,其他的catch语句被忽略,执行从try/catch块以后的第一行代码继续。这里,类型匹配是指catch所处理的异常类型与生成的异常对象的类型或者是它的父类完全一致。当D:\test.txt文件不存在时,程序发生FileNotFoundException异常,运行结果如图7.5所示。图7.5例7-4的运行结果当D:\test.txt文件存在时,程序不会发生FileNotFoundException异常。程序向下执行并发生ArrayIndexOutOfBoundsException异常,运行结果如图7.6所示。图7.6例7-4的另一个运行结果当有多个catch语句时,catch语句的排列顺序应该是从特殊异常到一般异常,即异常子类必须排在它们任何父类之前。比如有两个catch语句分别处理ArithmeticException和Exception两类异常对象,则ArithmeticException类的catch语句要写在Exception类的catch语句之前。通常最后一个catch语句的异常类参数都声明为Exception,这样能够保证捕获和处理所有的异常对象。7.2.2声明抛出异常
在有些情况下,一个方法并不需要处理它所生成的异常,或者不知道该如何处理这一异常,这时它就向上传递,由调用它的方法来处理这些异常。throws语句就用来处理这种情况。throws语句用于方法的声明中,用来声明该方法可能要抛出的异常类型。该方法的调用者必须捕获并处理该类型的异常,这样就实现了异常对象在方法之间的传递。包含一个throws语句的方法声明的通用形式如下:
typemethod-name(exception-list)throwsexception-list
{
//bodyofmethod
}
这里,exception-list是该方法可以引发的以逗号分割的异常列表。
【例7-5】错误的示例。该例试图引发一个它不能捕获的异常。因为程序没有指定一个throws子句来声明这一事实,程序将无法编译。
publicclassExample7_5{
staticvoidthrowOne(){
System.out.println(“InsidethrowOne.”);
thrownewIllegalAccessException(“demo”);
}
publicstaticvoidmain(Stringargs[]){
throwOne();
}
}
【例7-6】正确的示例。为编译例7.5的程序,需对其进行以下修改:①声明throwOne()方法引发IllegalAccessException异常;②main()方法必须定义一个try/catch语句来捕获该异常。
publicclassExample7_6{
staticvoidthrowOne()throwsIllegalAccessException{
System.out.println(“InsidethrowOne.”);
thrownewIllegalAccessException(“demo”);
}
publicstaticvoidmain(Stringargs[]){
try{
throwOne();
}
catch(IllegalAccessExceptione){
System.out.println(“Caught”+e);
}
}
}图7.7例7-6的运行结果7.3finally子句
异常改变了程序正常的执行流程。如例7-4所示,程序打开了文件D:\test.txt后发生异常,此时文件尚未关闭,将导致文件写入失败。如果程序使用了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally。finally创建一个代码块,该代码块在一个try/catch块完成之后另一个try/catch块出现之前执行。finally块无论有没有异常引发都会被执行,这在关闭文件句柄和释放任何在方法开始时被分配的其他资源是很有用的。
try、catch、finally三个语句块均不能单独使用,三者可以组成try...catch...finally、try...catch、try...finally三种结构。catch语句可以有一个或多个,finally语句最多一个。try、catch、finally三个代码块中变量的作用域仅限于代码块内部,分别独立且不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
例7.7显示
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年铜材热挤压件项目投资可行性研究分析报告
- 金威啤酒公司的成本管理绝技
- 中国汽车HUD行业竞争格局分析及投资规划研究报告
- 2025年度共享工作人员社会保险缴纳合同
- 代理配股合同范例
- 劳动合同范本养殖
- 伐木砍伐工程合同范例
- 农村旧房拆迁合同范本
- 代养鹅合同范本
- 公司转让协议合同范本
- 小学道德与法治课堂教学中提升学生核心素养策略
- 统编版三年级语文下册第三单元《综合性学习:中华传统节日》教案
- 儿童注意力测试表
- 大学生预征对象登记表
- EN50317-2002-铁路应用集电系统受电弓和接触网的动力交互
- 人教版美术八下课程纲要
- 项目部组织机构框图(共2页)
- 机动车登记证书
- 钽铌矿开采项目可行性研究报告写作范文
- 小升初数学衔接班优秀课件
- 出口食品生产企业备案自我评估表
评论
0/150
提交评论