《SUN_JAVA 培训专用教材C07.docx》由会员分享,可在线阅读,更多相关《SUN_JAVA 培训专用教材C07.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章 异 常本模块讲讲述建立立在Jaava编编程语言言中的错错误处理理装置。第一节 相关关问题讨论下下述问题题与本模模块中的的材料相相关:- 在大部分分编程语语言中,如如何解决决运行时时错误?第二节 目 的本模块学学习结束束后,能能够:- 定义异常常- 使用trry,ccatcch和finnallly语句句- 描述异常常分类- 开发程序序来处理理自己的的异常第三节 异 常异 常异常类定定义程序序所遇到到的轻微微错误发生下列列情况时时,会出出现异常常:想打开的的文件不不存在网络连接接中断受控操作作数超出出预定范范围非常感兴兴趣地正正在装载载的类文文件丢失失错误类定定义严重重的错误误条件7.3.
2、1介绍绍什么是异异常?在在Javva编程程语言中中,异常常类定义义程序中中可能遇遇到的轻轻微的错错误条件件。可以以写代码码来处理理异常并并继续程程序执行行,而不不是让程程序中断断。在程序执执行中,任任何中断断正常程程序流程程的异常常条件就就是错误误或异常常。例如如,发生生下列情情况时,会会出现异异常:- 想打开的的文件不不存在- 网络连接接中断- 受控操作作数超出出预定范范围- 非常感兴兴趣地正正在装载载的类文文件丢失失 在Jaava编编程语言言中,错错误类定定义被认认为是不不能恢复复的严重重错误条条件。在在大多数数情况下下,当遇遇到这样样的错误误时,建建议让程程序中断断。 Javva编程程语
3、言实实现C+异常常来帮助助建立弹弹性代码码。在程程序中发发生错误误时,发发现错误误的方法法能抛出出一个异异常到其其调用程程序,发发出已经经发生问问题的信信号。然然后,调调用方法法捕获抛抛出的异异常,在在可能时时,再恢恢复回来来。这个个方案给给程序员员一个写写处理程程序的选选择,来来处理异异常。通过浏览览APII,可以以决定方方法抛出出的是什什么样的的异常。7.3.2实例例考虑一下下HellloWWorlld.jjavaa程序版版本的简简单扩展展,它通通过信息息来循环环:1. publlic claass HellloWWorlld 2. puubliic sstattic voiid mmai
4、nn (SStriing arggs) 3. intt i = 00; 4.5. Strringg grreettinggs = 6. Helllo worrld!,7. No, I meaan iit!,8. HELLLO WORRLD!9. ;10.11. whiile (i javva HHellloWoorldd2. Helllo wworlld!3. No, I mmeann itt!4. HELLLO WWORLLD!5. javaa.laang.ArrrayIIndeexOuutOffBouundssExccepttionn: 336. at HellloWWorlld.mmai
5、nn(HeellooWorrld.javva:112) 异常处理理允许程程序捕获获异常,处处理它们们,然后后继续程程序执行行。它是是分层把把关,因因此,错错误情况况不会介介入到程程序的正正常流程程中。特特殊情况况发生时时,在与与正常执执行的代代码分离离的代码码块中被被处理。这就产产生了更更易识别别和管理理的代码码。第四节 异常常处理Javaa编程语语言提供供了一个个来考虑虑哪个异异常被抛抛出以及及如何来来恢复它它的机制制。7.4.1 tryy和cattch语语句try和和cattch语语句1. trry 2. / codde tthatt miightt thhroww a parrticcu
6、laar eexceeptiion3. cattch (MyyExccepttionnTyppe ee) 4. / codde tto eexeccutee iff a MyEExceeptiionTTypee exxcepptioon iis tthroown 5. cattch (Exxcepptioon ee) 6. / ccodee too exxecuute if a ggeneerall Exxcepptioon eexceeptiion is thrrownn 7. 要处理特特殊的异异常,将将能够抛抛出异常常的代码码放入ttry块块中,然然后创建建相应的的cattch块块的列表表
7、,每个个可以被被抛出异异常都有有一个。如果生生成的异异常与ccatcch中提提到的相相匹配,那那么caatchh条件的的块语句句就被执执行。在在tryy块之后后,可能能有许多多cattch块块,每一一个都处处理不同同的异常常。1. tryy 2. / ccodee thhat migght thrrow a ppartticuularr exxcepptioon3. ccatcch (MyEExceeptiionTTypee e) 4. / ccodee too exxecuute if a MMyExxcepptioonTyype exccepttionn iss thhrowwn 5. c
8、catcch (Exccepttionn e) 6. / coode to exeecutte iif aa geenerral Exccepttionn exxcepptioon iis tthroown 7. 7.4.2 调用栈栈机制如果方法法中的一一个语句句抛出一一个没有有在相应应的trry/ccatcch块中中处理的的异常,那那么这个个异常就就被抛出出到调用用方法中中。如果果异常也也没有在在调用方方法中被被处理,它它就被抛抛出到该该方法的的调用程程序。这这个过程程要一直直延续到到异常被被处理。如果异异常到这这时还没没被处理理,它便便回到mmainn(),而而且,即即使maain()不处
9、处理它,那那么,该该异常就就异常地地中断程程序。考虑这样样一种情情况,在在该情况况中maain()方法法调用另另一个方方法(比比如,ffirsst()),然然后它调调用另一一个(比比如,ssecoond())。如果在在seccondd()中中发生异异常,那那么必须须做一个个检查来来看看该该异常是是否有一一个caatchh;如果果没有,那那么对调调用栈(first())中的下一个方法进行检查,然后检查下一个(main())。如果这个异常在该调用栈上没有被最后一个方法处理,那么就会发生一个运行时错误,程序终止执行。7.4.3 finnallly语句句finaallyy语句1. try 2. stt
10、arttFauucett();3. waaterrLawwn();4. 5. finaallyy 6. sttopFFauccet();7. finnallly语句句定义一一个总是是执行的的代码块块,而不不考虑异异常是否否被捕获获。下述述样板代代码来自自Fraank Yelllinn弗兰克克叶林的的白皮书书Jaava中中的低级级安全:1. try 2. sttarttFauucett();3. waaterrLawwn();4. 5. finaallyy 6. sttopFFauccet();7. 在前面的的例子中中,即使使异常在在打开开开关或给给草地浇浇水时发发生,开开关也能能被关掉掉。tr
11、ry 后后面的括括号中的的代码被被称做保保护码。如果终止止程序的的Sysstemm.exxit()方法法在保护护码内被被执行,那那么,这这是fiinallly语语句不被被执行的的唯一情情况。这这就暗示示,控制制流程能能偏离正正常执行行顺序,比比如,如如果一个个retturnn语句被被嵌入ttry块块内的代代码中,那那么,ffinaallyy块中的的代码应应在reeturrn前执执行。7.4.4重访访前例下面的例例子是第第1699页maiin()方法的的重写。本程序序以前的的版本中中产生的的异常被被捕获,数数组索引引重新设设定,使使下述程程序继续续运行。1. publlic staaticc v
12、ooid maiin (Strringg arrgs) 2. innt ii = 0;3. Sttrinng ggreeetinngs = 4. Heelloo woorldd!,5. Noo, II meean it!,6. HEELLOO WOORLDD!7. ;8. whhilee (ii 4) 9. tryy 10. Sysstemm.ouut.pprinntlnn (ggreeetinngsi);11. ccatcch (ArrrayIIndeexOuutOffBouundssExccepttionn e)12. Sysstemm.ouut.pprinntlnn( Re-settti
13、nng IIndeex VValuue);13. i = -11;14. ffinaallyy 15. Sysstemm.ouut.pprinntlnn(TThiss iss allwayys pprinntedd);16. 17. i+;18. / eend whiile()19. / eend maiin() 当循环被被执行时时,下述述在屏幕幕上出现现的信息息将改变变。1. Helllo wworlld!2. Thiss iss allwayys pprinntedd3. No, I mmeann itt!4. Thiss iss allwayys pprinntedd5. HELLLO
14、WWORLLD! 6. Thiss iss allwayys pprinntedd7. Re-ssetttingg Inndexx Vaaluee 8. Thiss iss allwayys pprinntedd 第五节 异常常分类在Javva编程程语言中中,异常常有三种种分类。Javva.llangg.Thhrowwablle类充充当所有有对象的的父类,可可以使用用异常处处理机制制将这些些对象抛抛出并捕捕获。在在Thrrowaablee类中定定义方法法来检索索与异常常相关的的错误信信息,并并打印显显示异常常发生的的栈跟踪踪信息。它有EErroor和Exccepttionn两个基基本子类类,如
15、下下图所示示:Throowabble类类不能使使用,而而使用子子类异常常中的一一个来描描述任何何特殊异异常。每每个异常常的目的的描述如如下:- Erroor表示示恢复不不是不可可能但很很困难的的情况下下的一种种严重问问题。比比如说内内存溢出出。不可可能指望望程序能能处理这这样的情情况。- RunttimeeExccepttionn表示一一种设计计或实现现问题。也就是是说,它它表示如如果程序序运行正正常,从从不会发发生的情情况。比比如,如如果数组组索引扩扩展不超超出数组组界限,那那么,AArraayInndexxOuttOfBBounndsEExceeptiion异异常从不不会抛出出。比如如,这
16、也也适用于于取消引引用一个个空值对对象变量量。因为为一个正正确设计计和实现现的程序序从不出出现这种种异常,通通常对它它不做处处理。这这会导致致一个运运行时信信息,应应确保能能采取措措施更正正问题,而而不是将将它藏到到谁也不不注意的的地方。- 其它异常常表示一一种运行行时的困困难,它它通常由由环境效效果引起起,可以以进行处处理。例例子包括括文件未未找到或或无效UURL异异常(用用户打了了一个错错误的UURL),如如果用户户误打了了什么东东西,两两者都容容易出现现。这两两者都可可能因为为用户错错误而出出现,这这就鼓励励程序员员去处理理它们。第六节 共同同异常共同异常常- Aritthmeeticc
17、Exccepttionn- NulllPoiinteerExxcepptioon- NegaativveArrrayySizzeExxcepptioon- ArraayInndexxouttofBBounndsEExceeptiion- SecuurittyExxcepptioon Javva编程程语言提提供几种种预定义义的异常常。下面面是可能能遇到的的更具共共同性的的异常中中的几种种:- AritthmeeticcExccepttionn整数被被0除,运运算得出出的结果果。- int I =12 / 00;- NulllPoiinteerExxcepptioon当对象象没被实实例化时时,访问
18、问对象的的属性或或方法的的尝试:- Datee d= nuull;- Systtem.outt.prrinttln(d.ttoSttrinng();- NegaativveArrrayySizzeExxcepptioon创建带带负维数数大小的的数组的的尝试。- ArraayInndexxouttofBBounndsEExceeptiion访问超超过数组组大小范范围的一一个元素素的尝试试。- SecuurittyExxcepptioon典型地地被抛出出到浏览览器中,SecurityManager类将抛出applets的一个异常,该异常企图做下述工作(除非明显地得到允许):- 访问一个个本地文文件
19、- 打开主机机的一个个socckett,这个个主机与与服务于于appplett的主机机不是同同一个。- 在运行时时环境中中执行另另一个程程序第七节 处理理或声明明规则处理或声声明规则则- 用tryy-caatchh-fiinallly块块来处理理异常- 使用thhrowws子句句声明代代码能引引起一个个异常为了写出出健壮的的代码,Java编程语言要求,当一个方法在栈(即,它已经被调用)上发生Exception(它与Error或RuntimeException不同)时,那么,该方法必须决定如果出现问题该采取什么措施。程序员可可以做满满足该要要求的两两件事:第一,通通过将TTrycaatchh()
20、块纳纳入其代代码中,在在这里捕捕获给被被命名为为属于某某个超类类的异常常,并调调用方法法处理它它。即使使cattch块块是空的的,这也也算是处处理情况况。第二,让让被调用用的方法法表示它它将不处处理异常常,而且且该异常常将被抛抛回到它它所遇到到的调用用方法中中。它是是按如下下所示通通过用tthroows子子句标记记的该调调用方法法的声明明来实现现的: puubliic vvoidd trroubblessomee() thrrowss IOOExccepttionn关键字tthroows之之后是所所有异常常的列表表,方法法可以抛抛回到它它的调用用程序中中。尽管管这里只只显示了了一个异异常,如如
21、果有成成倍的可可能的异异常可以以通过该该方法被被抛出,那那么,可可以使用用逗号分分开的列列表。是选择处处理还是是选择声声明一个个异常取取决于是是否给你你自己或或你的调调用程序序一个更更合适的的候选的的办法来来处理异异常。注由于于异常类类象其它它类一样样被组编编到层次次中,而而且由于于无论何何时想要要使用超超类都必必须使用用子类,因此,可以捕获异常“组”并以相同的捕获代码来处理它们。例如,尽管IOExceptions(EOFException,FileNotFoundException等等)有几种不同的类型,通过俘获IOException,也可以捕获IOException任何子类的实例。第八节
22、创建建自己的的异常7.8.1介绍绍用户定义义异常是是通过扩扩展Exxcepptioon类来来创建的的。这种种异常类类可以包包含一个个“普通”类所包包含的任任何东西西。下面面就是一一个用户户定义异异常类例例子,它它包含一一个构造造函数、几个变变量以及及方法:1. publlic claass SerrverrTimmedOOutEExceeptiion exttendds EExceeptiion 2. priivatte SStriing reaasonn;3. priivatte iint porrt;4. pubblicc SeerveerTiimeddOuttExccepttionn (
23、SStriing reaasonn,innt pportt) 5. tthiss.reeasoon = reeasoon;6. tthiss.poort = pportt;7. 8. pubblicc Sttrinng ggetRReasson() 9. retturnn reeasoon;10. 11. pubblicc innt ggetPPortt() 12. rretuurn porrt;13. 14. 使用语句句来抛出出已经创创建的异异常:throow nnew SerrverrTimmedOOutEExceeptiion(Coouldd noot cconnnectt, 80);7
24、.8.2实例例考虑一个个客户服服务器程程序。在在客户代代码中,要要与服务务器连接接,并希希望服务务器在55秒钟内内响应。如果服服务器没没有响应应,那么么,代码码就如下下所述抛抛出一个个异常(如如一个用用户定义义的SeerveerTiimeddOuttExccepttionn)。1. pubblicc vooid connnecctMee(Sttrinng sservverNNamee) tthroows SeerveerTiimeddOuttExccepttionn 2. int succcesss;3. int porrtTooConnnecct = 800;4. succcesss = o
25、peen(sservverNNamee, pporttToCConnnectt);5. if (succcesss = -1) 6. throow nnew SerrverrTimmedOOutEExceeptiion(7. Couuld nott coonneect, 880);8. 9. 要捕获异异常,使使用trry语句句:1. publlic voiid ffinddSerrverr() 2. . . .3. try 4. connnecttMe(deffaulltSeerveer);5. caatchh(SeerveerTiimeddOuttExccepttionn e) 6. Sys
26、ttem.outt.prrinttln(Seerveer ttimeed oout, trryinng aalteernaate);7. try 8. connnecttMe(altternnateeSerrverr);9. caatchh (SServverTTimeedOuutExxcepptioon ee1) 10. Systtem.outt.prrinttln(Noo seerveer ccurrrenttly avaailaablee);11. 12. 13. . .注trry和cattch块块可以如如前例所所述那样样被嵌套套。也可能部部分地处处理一个个异常然然后也将将它抛出出。如:
27、try . caatchh (SServverTTimeedOuutExxcepptioon ee) Syysteem.oout.priintlln(Errror cauughtt ); thhroww e;练习:处处理并创创建异常常练习目的的通过编编写可以以创建并并处理异异常的JJavaa软件程程序,可可以获得得异常机机制的经经验。一、准备备为了成功功地完成成该实验验,必须须理解处处理运行行时错误误的异常常的概念念。二、任务务一级实验验:处理理一个异异常 1. 使用第第1699页上的的样板异异常程序序在数组组索引超超出数组组大小时时创建一一个异常常。(或或修改自自己的程程序以便便创建一一个异
28、常常。) 2. 使用trry和cattch语语句从异异常进行行恢复。二级实验验:创建建自己的的异常使用模块块5中创建建的baank包包并附加加下述异异常:AccoounttOveerdrrawnnExccepttionn当有了了这个要要取出比比帐户上上更多的的钱的尝尝试时。InvaaliddDepposiitExxcepptioon当无效效钱数(小小于0)存入入时。三、练习习总结讨论花花几分钟钟时间讨讨论实验验练习中中所取得得的经验验、问题题或发现现。l 经验 解释 总结 应用四、检查查进步情情况在继续下下一个模模块前,检检查一下下,确信信能够:- 定义异常常- 使用trry,cattch和和finnallly语句句- 描述异常常分类- 确认共同同异常- 开发程序序来处理理自己的的异常五、思考考Javaa应用环环境有什什么特征征,使它它支持用用户界面面的开发发?107