版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第13章
异常处理2动因当一个程序运行时出现一个运行时错误时,这个程序就会异常终止
。该如何处理这个运行时错误,以使程序可以继续运行或者平稳终止呢?
这就是本章要介绍的主题。
3学习目标了解异常和异常处理的概貌(第13.2节)。探究使用异常处理的优点(第13.3节)。区别异常的类型:
Error(致命的)和
Exception(非致命的),以及必检和免检异常(第13.4节)。在方法头中声明异常(第13.5.1节)。在方法中抛出异常(第13.5.2节)。编写try-catch
块处理异常(第13.5.3节)。解释异常是如何传播的(第13.5.3节)。在try-catch块中使用finally子句(第13.6节)。只为非预期错误使用异常(第13.7节)。在catch
块中重新抛出异常(第13.8节)。创建链式异常(第13.9节)。定义自定制的异常类(第13.10节)。4异常处理概述QuotientRunQuotientWithIfRunQuotientWithExceptionRun显示运行时错误使用一条if语句来处理它如果在方法被调用时发生运行错误该怎么办?5异常处理的优势QuotientWithMethodRun现在,你看到了使用异常处理的优点。它能使方法抛出一个异常给它的调用者。这个调用者可以处理该异常。如果没有这个能力,那么被调用的方法就必须自己处理异常或终止该程序。6处理InputMismatchException异常InputMismatchExceptionDemoRun通过处理异常InputMismatchException,程序将可以继续读取输入直到它是正确的为止。7异常类型8系统错误系统错误(Systemerrors)
是由Java虚拟机抛出的,它用Error类表示。Error类描述的是内部系统错误。这样的错误很少发生。如果发生,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做。9异常异常(Exception)
描述的是由程序和外部环境所引起的错误,这些错误能被程序捕获和处理。10运行时异常运行时异常(RuntimeException)是程序设计错误所引起的,例如,错误的类型转换、访问越界数组或数值错误。11必检异常和免检异常RuntimeException、Error以及它们的子类都被称为免检异常(unchecked
exceptions)。所有其它异常都被称为必检异常(checkedexceptions),意思是编译器会强制程序员检查并处理它们。12免检异常在大多数情况下,免检异常都会反映出程序设计中不可恢复的逻辑错误。例如:如果通过一个引用变量访问一个对象之前并未将一个对象赋值给它,就会抛出一个
NullPointerException异常;如果访问一个数组的界限外的元素,就会抛出IndexOutOfBoundsException异常。这些都是程序中必须纠正的逻辑错误。免检异常可能在程序的任何一个地方出现。为避免过多地使用try-catch块,Java语言不允许编写代码捕获或声明免检异常。13免检异常免检异常。14声明、抛出和捕获异常15声明异常每个方法都必须声明它可能抛出的必检异常的类型。这被称为声明异常(declaringexceptions)。
publicvoidmyMethod()throwsIOExceptionpublicvoidmyMethod()throwsIOException,OtherException16抛出异常当程序检测一个错误时,程序可以创建一个恰当的异常类型的实例并抛出它。这就被称为抛出一个异常(throwinganexception)。这里有一个例子:thrownewTheException();TheExceptionex=newTheException();
throwex;17抛出异常举例
/**Setanewradius*/publicvoidsetRadius(doublenewRadius)
throwsIllegalArgumentException{if(newRadius>=0)radius=newRadius;else
thrownewIllegalArgumentException("Radiuscannotbenegative");}18捕获异常try{statements;//Statementsthatmaythrowexceptions}catch(Exception1exVar1){handlerforexception1;}catch(Exception2exVar2){handlerforexception2;}...catch(ExceptionNexVar3){handlerforexceptionN;}
19捕获异常20捕获或声明必检异常Java强迫程序员处理必检异常。如果方法声明了一个必检异常(即Error或RuntimeException之外的异常),就必须在try-catch块中调用它,或者在调用方法中声明要抛出异常。例如:假定方法p1调用方法p2,而p2
可能会抛出一个必检异常(例如:IOException),就必须编写如图(a)和(b)所示代码。21举例:声明、抛出和捕获异常目标:本例改写第8章中定义的Circle类的setRadius方法来演示如何声明、抛出和捕获异常。如果半径是负数,那么新的setRadius方法就会抛出一个异常。TestCircleWithExceptionRunCircleWithException22重新抛出异常try{statements;}catch(TheExceptionex){performoperationsbeforeexits;throwex;}23finally子句try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}24跟踪程序执行动画try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;假设语句中没有出现异常25跟踪程序执行动画try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;finally子句总是会被执行26跟踪程序执行动画try{statements;}catch(TheExceptionex){handlingex;}finally{finalStatements;}Nextstatement;执行这个方法的下一条语句27跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;假设在statement2中有Exception1类型的异常被抛出28跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;这个异常被处理29跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;final块总是会被执行30跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}finally{finalStatements;}Nextstatement;现在执行方法后的下一条子句31跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;statement2抛出一个Exception2类型的异常32跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;处理异常33跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;执行final块34跟踪程序执行动画try{statement1;statement2;statement3;}catch(Exception1ex){handlingex;}catch(Exception2ex){handlingex;throwex;}finally{finalStatements;}Nextstatement;重新抛出异常并把控制权交给调用者35使用异常时注意事项异常处理将错误处理代码从正常的程序设计任务中分离开,这样,程序会更易阅读和修改。但是,应该注意,由于异常处理需要初始化新的异常对象,需要从调用栈返回而且还需要沿着方法调用链来传播异常以便找到它的异常处理器,所以,异常处理通常需要更多的时间和资源。36何时抛出异常异常出现在方法中。如果想让该方法的调用者处理异常,你应该创建一个异常对象并将其抛出。如果能在发生异常的方法中处理异常,那么就不需要抛出异常。37何时使用异常在代码中,什么时候应该使用try-catch块呢?当必须处理不可预料的错误状况时应该使用它。不要用它来处理简单的、可预料的情况。例如,下面的代码:try{System.out.println(refVar.toString());}catch(NullPointerExceptionex){System.out.println("refVarisnull");}38何时使用异常最好用以下代码代替:if(refVar!=null)System.out.println(refVar.toString());elseSystem.out.println("refVarisnull");39定义自定制异常类尽量使用API中的异常类。如果预定义的类不够则定义自定制的异常类。通过扩展Exception类或其子类定义自定制的异常类。40自定制异常类举例RunInvalidRadiusException在程序清单13.8中,当半径为负时,setRadius方法会抛出一个异常。假设希望把这个半径传递给处理者,就必须创建一个自定制的异常类。CircleWithRadiusExceptionTestCircleWithRadiusException41断言(Assertion)断言就是Java程序中的一条语句,它能够判断你程序中的某个假设。一个断言包含一个布尔表达式,当程序执行时,该表达式必须为真。断言用于保证程序的正确性和避免逻辑错误。配套网站42声明断言通过使用JDK1.4版本中的Java关键字assert来声明一个断言:assertassertion;
或assertassertion:detailMessage;这里的断言是一个boolean表达式,detailMessage是一个基本类型或者是一个对象(Object)。配套网站43执行断言当执行断言语句时,Java会计算这个断言。如果它的值为false,那么该语句将抛出一个AssertionError对象。AssertionError类有一个无参数的构造函数和7个单参数的重载构造函数,参数的类型可以是int、long、float、double、boolean、char和Object。对第一种没有详细参数的断言语句,调用AssertionError的无参的构造函数。对于第二种有详细消息断言语句,参数和消息数据类型匹配的构造函数被调用。因为AssertionError是Error类的子类,所以当断言为false时,程序会在控制台上显示一条信息并退出。配套网站44执行断言举例publicclassAssertionDemo{publicstaticvoidmain(String[]args){inti;intsum=0;for(i=0;i<10;i++){sum+=i;}asserti==10;assertsum>10&&sum<5*10:"sumis"+sum;}}配套网站45编译带断言的程序因为assert是JDK1.4新引入的Java关键字,所以我们必须使用JDK1.4版本的编译器来编译程序。此外,你还需要在编译命令上添加“–source1.4”,如下:javac–source1.4AssertionDemo.java注:如果你使用的是JDK1.5,就不用在命令上使用“–source1.4”这一项。配套网站46运行带断言的程序默认情况下,断言在运行时是禁用的。为了使用它,使用开关
–enableassertions或
–ea,如下所示:java–eaAssertionDemo断言可以在类级别或包级别选择性的启用或禁用。禁用开关是–disableassertions或
–da
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业会计基础培训
- 基层医疗改革
- 2024安置房买卖合同范参考
- 2024标准民间抵押贷款合同
- 2023年滤片项目成效分析报告
- 2024至2030年中国金补口服液数据监测研究报告
- 2024至2030年中国脱酚酚油行业投资前景及策略咨询研究报告
- 2024年电池组配件项目综合评估报告
- 2024至2030年中国碘乙酰胺数据监测研究报告
- 2024至2030年中国电动拉缆机数据监测研究报告
- 职称申报诚信承诺书(个人)附件4
- 仓库管理培训课件
- 2024年秋江苏开放大学文献检索与论文写作参考范文一:行政管理专业
- 广东省揭阳市2024-2025学年高二上学期期中考试英语试题(含答案)
- 酒店客房打扫培训
- 传感器基础知识单选题100道及答案解析
- 网络平台运营合同三篇
- 施工现场管理制度培训
- 电力工程施工安全管理措施
- 安全生产专(兼)职管理人员职责
- 湖南省长沙市长沙市长郡集团联考2024-2025学年九年级上学期11月期中语文试题(含答案)
评论
0/150
提交评论