版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章异常本模块讲述建立在Java编程语言中的错误处理装置。TheJ螃皿4ava Prog 臼 nnnn“6 皿叼 weeds:产 d Typpg LanguageWwCootwdAc切g7.Object-Oriented ProgrammingZU 勺冷 Fs&uss:Ex&sptibh HN/dlingEC5ptj-XtfDeveloping Graphical U5er Interfac&sThe AWTr*心idwxm-Cccnpcci4rt Utscy加 FOUiditZoappmtsTittodiKtkn8而格即OX?MultithreadingitisMgCqmmuni 谢。ns
2、-4小,第一节相关问题讨论一下述问题及本模块中的材料相关:-在大部分编程语言中,如何解决运行时错误?第二节目的本模块学习结束后,能够:- 定义异常- 使用 try, catch 和 finally 语句- 描述异常分类- 开发程序来处理自己的异常第三节异常异 常异常类定义程序所遇到的轻微错误发生下列情况时,会出现异常:想打开的文件不存在网络连接中断受控操作数超出预定范围非常感兴趣地正在装载的类文件丢失错误类定义严重的错误条件.1介绍什么是异常?在Java编程语言中,异常类定义程序中可能遇到的轻微的错误条件。可以写代码来处理异常并继续程序执行,而不是让程序中断。在程序执行中,任何中断正常程序流程
3、的异常条件就是错误或异常。例如,发 生下列情况时,会出现异常:- 想打开的文件不存在- 网络连接中断- 受控操作数超出预定范围- 非常感兴趣地正在装载的类文件丢失在Java编程语言中,错误类定义被认为是不能恢复的严重错误条件。在大多数 情况下,当遇到这样的错误时,建议让程序中断。Java编程语言实现C+异常来帮助建立弹性代码。在程序中发生错误时,发现 错误的方法能抛出一个异常到其调用程序,发出已经发生问题的信号。然后,调用 方法捕获抛出的异常,在可能时,再恢复回来。这个方案给程序员一个写处理程序 的选择,来处理异常。通过浏览API,可以决定方法抛出的是什么样的异常。7. 3. 2实例考虑一下H
4、elioWorld, java程序版本的简单扩展,它通过信息来循环:1. public class HelloWorld 2. public static void main (String args) 3. int i = 0;4.5. String greetings 口 = 6. “Helloworld!”,7. No, Imean it!,8. HELLOWORLD!9. );10.11. while (i java HelloWorld2. Hello world!3. No, I mean it!4. HELLO WORLD!5. java. lang. ArrayIndexOut
5、OfBoundsException: 36. at HelloWorld. main(HelloWorld. java:12)97 / 9异常处理允许程序捕获异常,处理它们,然后继续程序执行。它是分层把关,因此, 错误情况不会介入到程序的正常流程中。特殊情况发生时,在及正常执行的代码分 离的代码块中被处理。这就产生了更易识别和管理的代码。第四节异常处理Java编程语言提供了一个来考虑哪个异常被抛出以及如何来恢复它的机制。7. 4. 1 try 和 catch 语句try和catch语句1. try 2. / code that might throw a particular exceptio
6、n3. catch (MyExceptionType e) 4. / code to execute if a MyExceptionType exception is thrown5. catch (Exception e) 6. / code to execute if a general Exception exception is thrown7. )要处理特殊的异常,将能够抛出异常的代码放入try块中,然后创建相应的catch 块的列表,每个可以被抛出异常都有一个。如果生成的异常及catch中提到的相匹 配,那么catch条件的块语句就被执行。在try块之后,可能有许多catch块,
7、每 一个都处理不同的异常。1. try 2. / code that might throw a particular exception3. catch (MyExceptionType e) 4. / code to execute if a MyExceptionType exception is thrown5. catch (Exception e) 6. / code to execute if a general Exception exception is thrown7. )7 . 4.2调用栈机制如果方法中的一个语句抛出一个没有在相应的try/catch块中处理的异常,那
8、么这个异常就被抛出到调用方法中。如果异常也没有在调用方法中被处理,它就被 抛出到该方法的调用程序。这个过程要一直延续到异常被处理。如果异常到这时还 没被处理,它便回到main。,而且,即使main ()不处理它,那么,该异常就异常地 中断程序。考虑这样一种情况,在该情况中main。方法调用另一个方法(比如,first (), 然后它调用另一个(比如,secondO ) o如果在second。中发生异常,那么必须做 一个检查来看看该异常是否有一个catch;如果没有,那么对调用栈(first。)中 的下一个方法进行检查,然后检查下一个(mainO) o如果这个异常在该调用栈上 没有被最后一个方法
9、处理,那么就会发生一个运行时错误,程序终止执行。8 .4.3 finally 语句finally 语句1. try 2. startFaucet();3. waterLawnO ;4. )5. finally 6. stopFaucet ();7. finally语句定义一个总是执行的代码块,而不考虑异常是否被捕获。下述样板 代码来自Frank Yellin弗兰克叶林的白皮书Java中的低级安全:1. try (2. startFaucet();3. waterLawn();4. )5. finally 6. stopFaucet ();7. )在前面的例子中,即使异常在打开开关或给草地浇水时
10、发生,开关也能被关掉。 try后面的括号中的代码被称做保护码。如果终止程序的System. exit。方法在保护码内被执行,那么,这是finally语 句不被执行的唯一情况。这就暗示,控制流程能偏离正常执行顺序,比如,如果一 个return语句被嵌入try块内的代码中,那么,finally块中的代码应在return前 执行。7. 4. 4重访前例下面的例子是第169页main。方法的重写。本程序以前的版本中产生的异常被 捕获,数组索引重新设定,使下述程序继续运行。1. public static void main (String args) 2. int i = 0;3. String gr
11、eetings 口 二4. “Helloworld!”,5. No, Imean it!,6. HELLOWORLD!7. );8. while (i 4) 9. try 10. System. out. printin (greetingsi);n. catch (ArrayIndexOutOfBoundsException e)12. System. out. printin (Re-settingIndexValue);13. i = -1;14. finally 15. System. out. printin (z,Thisisalwaysprinted);16. 17. i+;18
12、. /endwhile ()19. /endmain()当循环被执行时,下述在屏幕上出现的信息将改变。1. Hello world!2. This is always printed3. No, I mean it!4. This is always printed5. HELLO WORLD!6. This is always printed7. Re-setting Index Value8. This is always printed第五节异常分类在Java编程语言中,异常有三种分类。Java. lang. Throwable类充当所有对象 的父类,可以使用异常处理机制将这些对象抛出并
13、捕获。在Throwable类中定义方 法来检索及异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有Error 和Exception两个基本子类,如下图所示: VI r tu.aUM8hineE rr or.ErrorOutOf Memory r ro rStackOve rf lowEr ro x fiWTErrorThrow 血 e- Ar i thjfte ticExc ep ti on Eunep tion NullP ointe rEcepti o I IndexOutOfBounds_Exception_Exception EOFExceptionI lOException F
14、i LeNotF oundExc ep tionThrowable类不能使用,而使用子类异常中的一个来描述任何特殊异常。每个异 常的目的描述如下:-Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢 出。不可能指望程序能处理这样的情况。-RuntimeException表示一种设计或实现问题。也就是说,它表示如果程序运 行正常,从不会发生的情况。比如,如果数组索引扩展不超出数组界限,那 么,ArraylndexOutOfBoundsException异常从不会抛出。比如,这也适用于 取消引用一个空值对象变量。因为一个正确设计和实现的程序从不出现这种 异常,通常对它不做处理
15、。这会导致一个运行时信息,应确保能采取措施更 正问题,而不是将它藏到谁也不注意的地方。- 其它异常表示一种运行时的困难,它通常由环境效果引起,可以进行处理。 例子包括文件未找到或无效URL异常(用户打了一个错误的URL),如果用户 误打了什么东西,两者都容易出现。这两者都可能因为用户错误而出现,这 就鼓励程序员去处理它们。第六节共同异常 共同异常- ArithmeticException- NullPointerException- NegativeArraySizeException- ArraylndexoutofBoundsException- SecurityExceptionJava
16、编程语言提供几种预定义的异常。下面是可能遇到的更具共同性的异常中 的几种:- ArithmeticException一整数被0除,运算得出的结果。- int I =12 / 0:- NullPointerException一当对象没被实例化时,访问对象的属性或方法的尝 试:- Date d= null;- System. out. printin (d. toString ();- NegativeArraySizeException创建带负维数大小的数组的尝试。- ArraylndexoutofBoundsException访问超过数组大小范围的一个元素的尝 试。- SecurityExce
17、ption一典型地被抛出到浏览涔中,SecurityManager类将抛出 applets的一个异常,该异常企图做下述工作(除非明显地得到允许): -访问一个本地文件-打开主机的一个socket,这个主机及服务于applet的主机不是同一个。-在运行时环境中执行另一个程序第七节处理或声明规则 处理或声明规则-用try-catch-finally块来处理异常-使用throws子句声明代码能引起一个异盘为了写出健壮的代码,Java编程语言要求,当一个方法在栈(即,它已经被调 用)上发生Exception (它及Error或RuntimeException不同)时,那么,该方法 必须决定如果出现问题
18、该采取什么措施。程序员可以做满足该要求的两件事:第一,通过将Try catch ( ) )块纳入其代码中,在这里捕获给被命名为 属于某个超类的异常,并调用方法处理它。即使catch块是空的,这也算是处理情 况。第二,让被调用的方法表示它将不处理异常,而且该异常将被抛回到它所遇到 的调用方法中。它是按如下所示通过用throws子句标记的该调用方法的声明来实现 的:public void troublesome() throws lOException关键字throws之后是所有异常的列表,方法可以抛回到它的调用程序中。尽管 这里只显示了一个异常,如果有成倍的可能的异常可以通过该方法被抛出,那么,
19、 可以使用逗号分开的列表。是选择处理还是选择声明一个异常取决于是否给你自己或你的调用程序一个更 合适的候选的办法来处理异常。注一由于异常类象其它类一样被组编到层次中,而且由于无论何时想要使用超类 都必须使用子类,因此,可以捕获异常“组”并以相同的捕获代码来处理它们。 例如,尽管lOExceptions (EOFException,等等)有几种不同的类型,通过俘获 lOException,也可以捕获lOException任何子类的实例。第八节创建自己的异常7. 8. 1介绍用户定义异常是通过扩展Exception类来创建的。这种异常类可以包含一个“普 通”类所包含的任何东西。下面就是一个用户定义
20、异常类例子,它包含一个构造函 数、儿个变量以及方法:1. public class ServerTimedOutException extends Exception 2. private String reason;3. private int port;4. public ServerTimedOutException (String reason, int port) 5. this. reason= reason;6. this, port =port;7. )8. public StringgetReasonO 9. return reason;10. 11. public int getPort () 12. return port;13. )14. )使用语句来抛出已经创建的异常:throw new ServerTimedOutException102 / 9(Could not connect”, 80);7. 8. 2实例考虑一个客户服务器程序。在客户代码中,要及服务器连接,并希望服务器在5 秒钟内响应。如果服务器没有响应,那么,代码就如下所述抛出一个异常(如一个 用户定义的 ServerTimedOutException)。1. public void connectMe(String se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026校招:财务面试题及答案
- 2026校招:TCL科技笔试题及答案
- 2026小米招聘试题及答案
- 餐厅消防安全培训课件
- 餐厅案例分享培训
- 《医学遗传学》期末考试试卷附答案
- 2025年公务员考试(时事热点)考前冲刺试题及答案
- 物资管理职责分工管理规定
- 飞来酷聊课件
- 2026年不动产继承权委托合同
- 2026湖南衡阳日报社招聘事业单位人员16人备考题库完整答案详解
- 2026年广东省事业单位集中公开招聘高校毕业生11066名参考考试试题及答案解析
- 孕产妇血液管理专家共识贫血管理2026
- 2026年1月浙江首考英语真题(解析版)
- 2026北京资产管理有限公司业务总监招聘1人笔试参考题库及答案解析
- 《中华人民共和国危险化学品安全法》全套解读
- 2025产品数字护照(DPP)技术发展报告
- 安全管理规程的建模规划
- AI情绪辅导与放松音乐创新创业项目商业计划书
- 鼻咽喉镜的NBI技术
- 诊所医保审批管理制度
评论
0/150
提交评论