版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9.1异常处理基础
9.1.1异常处理机制Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象。当异常情况发生时,一个代表该异常的对象被创建,并且在导致该错误的方法中被引发(throw)。该方法可以选择自己处理异常或传递该异常。两种情况下,该异常被捕获(catch)并处理。异常可能是由Java运行时系统产生,或者是由用户输入不合理产生。例如:①想打开的文件不存在。②网络连接中断。③操作数超过范围。④访问的数据库打不开。⑤对负数开平方根。⑥对字符串做算术运算。下一页返回9.1异常处理基础
被Java引发的异常与违反语言规范或超出Java执行环境限制的基本错误有关;而用户输入不合理产生的异常基本上用于报告方法调用程序的出错状况。Java异常处理通过5个关键字控制:try、catch、throw、throws和finally。下面介绍它们如何工作。程序声明了想要的异常监控程序段包含在一个try块中。如果在try块中发生异常,它被抛出。代码可以捕捉这个异常(用catch)并且用某种合理的方法处理该异常。系统产生的异常在Java运行时被系统自动引发。手动引发一个异常,用关键字throw。任何被引发方法的异常都必须通过throws子句定义。任何在方法返回前绝对被执行的代码被放置在finally块中。上一页下一页返回9.1异常处理基础
下面是一个异常处理块的通常形式:这里,ExceptionType是发生异常的类型。上一页返回下一页9.1异常处理基础
9.1.2异常的类层次Java是采用面向对象的方法来处理异常的,一个异常事件是由一个异常对象来代表的。异常类的层次如图9-1所示。从图9-1中可以看到,所有异常类型都是内置类Throwable的子类,因此,Throwable在异常类层次结构的顶层。紧接着Throwable下面的是两个把异常分成两个不同分支的子类。一个分支是Exception。该类用于用户程序可能捕捉的异常情况。可以通过扩展Exception或Exception的子类来创建自定义的异常类。在Exception分支中还有一个重要子类RuntimeException。该类型的异常自动为所编写的程序定义并且包括被零除和非法数组索引这样的错误,如除数为0、操作数超出数据范围、打开文件不存在等。下一页返回上一页9.1异常处理基础
另一类分支由Error作为顶层,Error定义了在通常环境下不希望被程序捕获的异常,如死循环或内存溢出。运行时程序本身无法解决,只能依靠其他程序干预,否则会一直处于不正常状态。Error类型的异常用于Java运行时显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一个典型例子。所以不过多讨论关于Error类型的异常处理,因为它们通常是灾难性的致命错误,不是程序可以控制的。上一页下一页返回9.1异常处理基础
接下来看看Java内置的一些常见的异常类。在标准包Java.lang中,Java定义了若干个异常类。这些异常一般是标准类RuntimeException的子类。因为Java.lang实际上被所有的Java程序引入,多数从RuntimeException派生的异常都自动可用。并且它们不需要被包含在任何方法的throws列表中。Java语言中,这被叫作未经检查的异常(uncheckedexceptions)。因为编译器不检查它来看一个方法是否处理或引发了这些异常。上一页下一页返回9.1异常处理基础
常见的Java在Java.lang中定义的未检查异常子类有:①ArithmeticException:算术错误,如被0除。②ArrayIndexOutOfBoundsException:数组下标出界。③ArrayStoreException:数组元素赋值类型不兼容。④ClassCastException:非法强制转换类型。⑤IllegalArgumentException:调用方法的参数非法。⑥IllegalMonitorStateException:非法监控操作,如等待一个未锁定线程。⑦IllegalStateException:环境或应用状态不正确。⑧IllegalThreadStateException:请求操作与当前线程状态不兼容。上一页下一页返回9.1异常处理基础
⑨IndexOutOfBoundsException:某些类型索引越界。⑩NullPointerException:非法使用空引用。⑪NumberFormatException:字符串到数字格式非法转换。⑫SecurityException:试图违反安全性。⑬StringIndexOutOfBounds:试图在字符串边界之外索引。⑭UnsupportedOperationException:遇到不支持的操作。上一页下一页返回9.1异常处理基础
在Java.lang还定义了必须在方法的throws列表中包括的异常。如果这些方法能产生其中的某个异常但是不能自己处理它,这些叫作受检查的异常(checkedexceptions)常见的Java在Java.lang中定义的检查异常子类有:①ClassNotFoundException:找不到类。②CloneNotSupportedException:试图克隆一个不能实现Cloneable接口的对象。③IllegalAccessException:对一个类的访问被拒绝。④InstantiationException:试图创建一个抽象类或者抽象接口的对象。上一页下一页返回9.1异常处理基础
⑤InterruptedException:一个线程被另一个线程中断。⑥NoSuchFieldException:请求的字段不存在。⑦NoSuchMethodException:请求的方法不存在。认识和了解这些常见的Java内置异常类可以更好地完善程序的健壮性,或是在程序发生某种异常后,能最快知道是什么地方出问题。9.1.3异常发生的原因如果程序引发一个异常,通常是由于以下原因引起的:①Java虚拟机检测到了非正常的执行状态,例如上节介绍的那些内置异常类型,这些异常都是无法预知的。②Java程序代码中的throw语句被执行。③异步异常发生,例如Thread的stop方法被调用或者Java虚拟机内部错误发生。上一页返回9.2Java的异常处理过程9.2.1声明异常在Java中,当前执行的语句必属于某个方法。Java解释器调用main方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常的类型,这称为声明异常。因为任何代码都可能发生系统错误和运行时错误,因此,Java不要求在方法中显式声明Error和RuntimeException(免检异常)。但是,方法要抛出的其他异常都必须在方法头显式声明,这样,方法的调用者会被告知有异常。下一页返回9.2Java的异常处理过程为了在方法中声明一个异常,就要在方法头中使用关键字throws,如下例所示:关键字throws表明myMethod方法可能会抛出异常IOException。如果方法可能会抛出多个异常,就可以在关键字throws后添加一个用逗号分隔的异常列表:注意,如果方法没有在父类中声明异常,那么就不能在子类中对其进行覆盖来声明异常。上一页下一页返回9.2Java的异常处理过程9.2.2抛出异常检测一个错误的程序可以创建一个正确异常类型的实例并抛出它,称为抛出一个异常。这里有一个例子,假如程序发现传递给方法的参数与方法的合约不符(例如,方法中的参数必须是非负的,但是传入的是一个负参数),这个程序就可以创建IllegalArgumentException的一个实例并抛出它,如下所示:上一页下一页返回9.2Java的异常处理过程也可以使用下面的语句:注意IllegalArgumentExceptian是JavaAPI中的一个异常类。通常,JavaAPI中的每个异常类至少有两个构造方法:一个无参构造方法和一个带可描述这个异常的String参数的构造方法。该参数称为异常消息,可以用getMessage()获取。上一页下一页返回9.2Java的异常处理过程9.2.3捕获异常当语义限制被违反时,将会抛出异常对象,并将引导程序流程从异常发生点转移到程序员指定的处理异常方法代码处进行异常处理。这就是异常捕获。一个方法如果对某种类型的异常对象提供相应的处理代码,则这个方法可以捕获该种异常。捕获异常通过以下流程处理:上一页下一页返回9.2Java的异常处理过程1.try语句块对异常进行处理时,一般是把可能会发生异常情况的代码放在try语句块中,利用try语句对这组代码进行监视。如果try语句块中的语句在执行的过程中发生了异常,则程序将抛出异常。2.catch语句块每个在try语句块都可以匹配一个或多个catch语句块(至少一个),用于捕获在try语句块中被抛出的异常,并对这个异常事件进行处理。catch语句在执行前,识别抛出的异常对象类型,如果catch语句参数中声明的异常类与抛出的异常类相同,或者是它的父类,那么catch语句就可以捕获到这种异常类的对象(e为相应的异常对象),然后程序跳转到相应的catch语句块内执行。请注意,如果不能确定会发生哪种情况的异常,那么最好指定catch的参数为Exception,即说明异常的类型为Exception。上一页下一页返回9.2Java的异常处理过程另外,捕获例外的顺序是和不同catch语句的顺序相关的,因此,在安排catch语句顺序时,首先应该捕获最特殊的例外,然后再逐渐一般化。如果一个异常类和其子类都出现在catch子句中,应把子类放在前面,否则将永远不会到达子类。例如:如果文件不存在的异常发生,那么第二个catch语句块将永远不会被执行,因为FileNotFoundException是IOException的子类。上一页下一页返回9.2Java的异常处理过程3.finally语句块每个try语句至少要有一个与之相匹配的finally语句块。finally语句块在try语句块退出后总是被执行,这保证了无论try语句块中是否有异常发生,finally语句块都会被执行。通常情况下,finally语句被用来清空内部状态或释放非对象资源。例如在I/O程序设计中,为确保某个文件在所有情况下均被关闭,就在finally块中放置一条文件关闭语句。try…cacth…finally子句可以嵌套。下面来看一个捕获异常的例子:【程序9.1】上一页下一页返回9.2Java的异常处理过程注意,在try块中对println()的调用是永远不会执行的。因为一旦异常被引发,程序控制由try块转到catch块,执行永远不会从catch块“返回”到try块,因此,“你永远看不到我”将不会被显示。一旦执行了catch语句,程序控制从整个try/catch机制的下面一行继续。一个try和它的catch语句形成了一个单元。catch子句的范围限制于try语句前面所定义的语句。一个catch语句不能捕获另一个try声明所引发的异常(除非是嵌套的try语句情况)。被try保护的语句声明必须在一个大括号之内(也就是说,它们必须在一个块中)。不能单独使用try。上一页下一页返回9.2Java的异常处理过程当然,通常情况下并不会像程序9.1一样,异常一定会出现。异常总是在不经意间出现的,所以修改一下上面的例子。【程序9.2】在程序9.2中,用一个0~5的随机数作为除数,当得到的随机数不为0时,程序就不会引发异常,不会执行catch程序块。程序将显示“你看见我了,因为没有出现0作除数”。上一页返回9.3创建自己的异常子类尽管Java的内置异常可以处理大多数常见错误,但也可能希望建立自己的异常类型来处理所应用的特殊情况。这是非常简单的,只要定义Exception的一个子类就可以了(Exception当然也是Throwable的一个子类)。这个子类不需要实际执行什么,只需要它们在类型系统中的存在允许把它们当成异常使用。Exception类自己没有定义任何方法,它只是继承了Throwable提供的一些方法。因此,所有异常(包括自己创建的)都可以获得Throwable定义的方法。这些方法有:①ThrowablefillInStackTrace():返回一个包含完整堆栈轨迹的Throwable对象,该对象可能被再次引发。②StringgetLocalizedMessage():返回一个异常的局部描述。下一页返回9.3创建自己的异常子类③StringgetMessage():返回一个异常的描述。④voidprintStackTrace():显示堆栈轨迹。⑤voidprintStackTrace(PrintStreamstream):把堆栈轨迹送到指定的字节流。⑥voidprintStackTrace(PrintWriterstream):把堆栈轨迹送到指定的字节流。⑦StringtoString():返回一个包含异常描述的String对象。当输出一个Throwable对象时,该方法被println()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年宠物营养师生骨肉方向高频考点速记
- 2026年亲子安全知识竞赛活动方案
- 2026年江苏省名校优生选调笔试模拟题
- 2026年举办安全知识竞赛活动方案设计
- 2026年人体经络专业知识培训
- 2026年线上知识竞答活动方案策划
- 2026年烟花爆竹行业职业技能题库
- 2026年宠物行为分析师实操测试
- 陕西省咸阳市实验中学2025-2026学年高一下学期期中质量检测物理试卷
- 头部引流管护理实践指南
- 2026上海大歌剧院管理有限公司夏季工作人员招聘137人笔试备考题库及答案解析
- 高考考务人员培训系统考试试题答案
- 2026上海市大数据中心招聘10名笔试参考题库及答案解析
- (二模)青岛市2026年高三年级第二次适应性检测语文试题(含答案)
- 国药集团2026届春季校园招聘笔试历年备考题库附带答案详解
- 产科孕产期管理诊疗常规
- 2026年河南省中考英语模拟试卷(三)(含答案)
- 天津师范大学与韩国世翰大学入学综合素质题目
- 中文版-ASTM-A123-A123M-02-铁和钢制品镀锌层
- 血液透析室(中心)的人员配置及职责
- GB/T 12642-2013工业机器人性能规范及其试验方法
评论
0/150
提交评论