《Java程序设计基础》第7章:例外处理.ppt_第1页
《Java程序设计基础》第7章:例外处理.ppt_第2页
《Java程序设计基础》第7章:例外处理.ppt_第3页
《Java程序设计基础》第7章:例外处理.ppt_第4页
《Java程序设计基础》第7章:例外处理.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章例外处理,学习重点:例外机制Java定义的例外类如何定义自己的例外类,第7章例外处理,7.1例外的概念7.1.1程序中的错误7.1.2例外的概念7.1.3例外控制机制7.2Java定义的例外类7.2.1Java中的例外类7.2.2例外类使用中的两个问题7.2.3例外在继承关系中的特殊性7.2.4例外的重新抛出7.3关于finally7.3.1finally的使用方法7.3.2finally用在哪里7.3.3finally的缺陷7.4定义自己的例外7.5练习题,7.1例外的概念,例外是一种对象,它是在某种运行错误时被创建的,例外控制机制是Java用来进行例外控制的一种有效手段。,7.1.1程序中的错误,编译错误程序的编制存在语法错误,编译器能检查出这种错误,此时程序不能继续运行。我们在以前的程序编制和运行中可能已经遇到过编译错误的情况,可以根据系统的提示加以修改运行错误程序在执行过程中产生的错误,它很有可能产生不可意料的结果,有时可能对系统有严重的危害,如计算机的瘫痪。,常见的运行错误表现为两个方面:一是对操作系统产生影响,出现死机、死循环等现象二是程序的运行结果和编程者的意图不符排除运行错误的手段:使用开发环境提供的单步运行机制和设置断点来暂停程序运行,一步步发现错误,或打印一部分的中间结果用于分析,找到错误。,7.1.2例外的概念,例外(Exception),在其他材料上可能被译为“异常”,指程序在执行过程中出现程序本身没有预料到的情况,从而导致程序错误结束。例外机制就是用来在发生运行异常时,告诉程序如何控制自身的运行,以防止错误的进一步恶化。,例外是一个对象,它在程序运行异常的时候被创建出来,并被在发生错误的位置抛出(throw),由一定的接收机制来接收并处理,这就是例外处理的一个简单过程例外的产生一定有条件的,例外条件与普通问题的区别:在普通问题的情况下,在当地可能有足够的信息,可在某种程度上解决碰到的问题。在例外条件的情况下,却无法继续下去,因为当地没有提供解决问题所需的足够多的信息。此时,我们能做的惟一事情就是跳出当地环境,将那个问题委托给一个更高级的负责人。这便是出现例外时的情况。,产生一个例外时,会发生几件事情,首先,按照与创建Java对象一样的方法创建例外对象:使用new来创建。随后,停止当前执行路径(记住不可沿这条路径继续下去),然后从当前的环境中释放出例外对象的地址。此时,例外控制机制会接管一切,并把程序运行转移到另一个地方,这个地方可称为例外控制器,它的职责是解决这个运行问题,要么使程序简单地继续,要么结束程序并报错。,产生例外的一个简单示例,假设有一个名为t的对象,它只是被定义,而还没有在内存中创建,这个对象名并未指向任何实际的内存地址if(t=null)thrownewNullPointerException();/“抛”出了一NullPointerException类的例外抛出这个例外后,“例外控制器”就会处理这个问题。,7.1.3例外控制机制,1.例外处理的语法结构对于Java的例外控制机制,Java把可能产生例外的代码段形成一个区域,可称为“警戒区”,然后紧接例外控制器。警戒区由try引导,例外控制器由catch引导,一个警戒区可以接多个catch从句,以对应多种例外。结构如下:try可能产生例外的代码段;catch(例外类名1对象名1)处理语句组1;catch(例外类名2对象名2)处理语句组2;try块一般位于一个方法的内部,它用来包含有可能抛出例外的程序段,try块的格式如下:,try可能产生例外的代码段try块中的代码段可以是几个简单语句,也可以是方法的调用,也可以是很复杂的结构,如以下的一种情况都可以:trythrownewExceptionName();tryfunctionA();/这个方法的调用可能产生例外tryinti=0;for(i=0;i100;i+)catch块是专门用来捕获例外的地方,在try块内部,不同的方法调用可能生成相同的例外,但只需要一个控制器。另外,在通常情况下,遇到例外时,程序会自行中断,而转到catch程序去继续执行,出现例外的语句后面的逻辑都将不再被执行,例7.1例外处理这个程序的处理逻辑是,在初始化时,创建一个类似数组的对象vector(关于vector的使用在后面章节介绍),像其中存储09十个数字,然后将这些数字取出来写入一个文件OutFile.txt中,如果这个文件不存在于当前目录中,就创建一个新文件。在程序中粗体字的部分都可能出现错误,因此,需要进行例外处理程序逻辑已经预计到的例外有两方面,一是数组下标出界,即ArrayIndexOutOfBoundsException二是IO错误,即IOException,并在两处catch语句中都做了相应处理,ListOfNumbers.java的源程序如下:importjava.io.*;importjava.util.Vector;publicclassListOfNumberspublicstaticvoidmain(Stringargs)ListOfNumberslist=newListOfNumbers();list.writeList();privateVectorvictor;privatestaticfinalintsize=10;publicListOfNumbers()victor=newVector(size);for(inti=0;isize;i+)victor.addElement(newInteger(i);publicvoidwriteList()PrintStreamout=null;trySystem.out.println(Enteringtrystatement);/打开向文件写入的输出流,在这句话执行过程中可能会出现错误out=newPrintStream(newFileOutputStream(OutFile.txt);/向输出流中写内容,也可能出现错误for(inti=0;isize;i+)out.println(Valueat:+i+=+victor.elementAt(i);catch(ArrayIndexOutOfBoundsExceptione)System.err.println(CaughtArrayIndexOutOfBoundsException:+e.getMessage();catch(IOExceptione)System.err.println(CaughtIOException:+e.getMessage();,假如对程序做一点修改,将“for(inti=0;isize;i+)”改为“for(inti=0;i=5)break;/用它来跳出无限循环,输出如下:,count=0:Exceptionthrownfinallyclauseexecutedcount=1:Noexceptionfinallyclauseexecutedcount=2:Exceptionthrownfinallyclauseexecutedcount=3:Noexceptionfinallyclauseexecutedcount=4:Exceptionthrownfinallyclauseexecuted,例7.10两个并列的例外控制结构ParataxisStructure.java的源文件如下:,publicclassParataxisStructurepublicstaticvoidmain(Stringargs)/第一个例外控制结构trythrownewException();catch(Exceptione)System.out.println(firstException!);finallySystem.out.println(finallyclause);/第二个例外控制结构trythrownewException();catch(Exceptione)System.out.println(secondException!);,输出结果,这个程序的输出结果如下:,firstException!finallyclausesecondException!,例外抛出后,如果不在当前的例外控制结构中被捕获,finally仍会在跳到上一层次的例外控制结构之前被执行。如下所示:publicclassNestedStructurepublicstaticvoidmain(Stringargs)System.out.println(Enteringfirsttryblock);trySystem.out.println(Enteringsecondtryblock);trythrownewException();finallySystem.out.println(finallyin2ndtryblock);/*trythrownewException();catch(Exceptiona)System.out.println(2ndtryblockinside);*/catch(Exceptione)System.out.println(CaughtExceptioninfirsttryblock);finallySystem.out.println(finallyin1sttryblock);,该程序的输出结果,该程序的输出如下:,EnteringfirsttryblockEnteringsecondtryblockfinallyin2ndtryblockCaughtExceptioninfirsttryblockfinallyin1sttryblock,例7.11在例外控制结构中使用break语句NestedStructure2.java的源文件如下:publicclassNestedStructure2publicstaticvoidmain(Stringargs)System.out.println(Enteringoutsideblock);/外层结构trySystem.out.println(Enteringinsideblock1);lebalname:/第一个内层结构trythrownewException();catch(Exceptione)System.out.println(CaughtanExceptionininsideblock1);breaklebalname;finally/这个finally从句仍被执行System.out.println(finallyininsideblock1);/第二个内层结构trySystem.out.println(Enteringinsideblock2);thrownewException();finally/加一个空的finally从句以完成一个例外控制结构catch(Exceptionc)System.out.println(CaughtanotherExceptioninoutsideblock);finallySystem.out.println(finallyinoutsideblock);,该程序的结果反映了程序经过的几个结构:,EnteringoutsideblockEnteringinsideblock1CaughtanExceptionininsideblock1finallyininsideblock1Enteringinsideblock2CaughtanotherExceptioninoutsideblockfinallyinoutsideblock,7.3.2finally用在哪里,以上的内容使我们对finally从句及例外控制有了更深入的了解,这一小节让我们看看finally真正应该用在哪里。通常若要设置另一些东西时,我们就可以用finally,例如,有时需要打开一个文件或者建立一个网络连接,或者在屏幕上画一些东西,甚至设置外部世界的一个开关,等等,如果这些动作完成之后发生了错误,产生了例外,我们用一般手段不能完成如关闭文件、断开网络连接等事情,就把它交给finally从句去做。,例7.12没有finally从句的不完善程序WithoutFinally.java的源文件如下:,classSwitchbooleanstate=false;booleanread()returnstate;voidon()state=true;voidoff()state=false;publicclassWithoutFinallystaticSwitchsw=newSwitch();publicstaticvoidmain(Stringargs)trysw.on();/这个操作可能抛出例外sw.off();catch(NullPointerExceptione)System.out.println(NullPointerException);sw.off();catch(IllegalArgumentExceptione)System.out.println(IOException);sw.off();,例7.13用finally从句改善的程序WithFinally.java的源文件如下:,classSwitch2booleanstate=false;booleanread()returnstate;voidon()state=true;voidoff()state=false;publicclassWithFinallystaticSwitch2sw=newSwitch2();publicstaticvoidmain(Stringargs)trysw.on();catch(NullPointerExceptione)System.out.println(NullPointerException);catch(IllegalArgumentExceptione)System.out.println(IOException);finallysw.off();,7.3.3finally的缺陷,一般情况下使用finally不会出现问题,但在一种特殊的程序结构中,会发生例外信息的丢失现象,结果如同使用了fillInStack()一样。,例7.13例外的丢失LostMessage.java的源文件如下:classImportantExceptionextendsExceptionpublicStringtoString()returnAnimportantexception!;classNormalExceptionextendsExceptionpublicStringtoString()returnAnormalexception;publicclassLostMessagevoidf()throwsImportantExceptionthrownewImportantException();voiddispose()throwsNormalExceptionthrownewNormalException();publicstaticvoidmain(Stringargs)throwsExceptionLostMessagelm=newLostMessage();trylm.f();finallylm.dispose();,如果把两个例外类改成空类体时,程序输出如下,ExceptioninthreadmainNormalExceptionatLostMessage.dispose(LostMessage.java:18)atLostMessage.main(LostMessage.java:25)原程序的输出如下:ExceptioninthreadmainAnormalexceptionatLostMessage.dispose(LostMessage.java:18)atLostMessage.main(LostMessage.java:25)可以看到这个程序的ImportantException类的例外信息没有了,7.4定义自己的例外,例外处理并不一定要使用Java定义的例外类。自己定义的例外类可能使用起来更方便,也更符合自己的应用需求。要定义自己的例外类,必须从一个现有的例外类继承,这个父类最好在含义上与新例外类近似。继承一个例外类相当简单。,例7.14自定义的例外类Inheriting.java的源文件如下:/定义例外类MyException是Exception的子类,也有两个构造函数,/事实上这两个构造函数与父类的构造函数没有区别classMyExceptionextendsExceptionpublicMyException()publicMyException(Stringmsg)super(msg);/定义主类publicclassInheritingpublicstaticvoidf()throwsMyExceptionSystem.out.println(ThrowingMyExceptionfromf();thrownewMyException();/以第一个构造函数创建例外publicstaticvoidg()throwsMyExceptionSystem.out.println(ThrowingMyExceptionfromg();thrownewMyException(Originateding();/以第二个构造函数创建例外/把f()、g()分别置入try块中,捕获它们产生的例外并打印堆栈信息publicstaticvoidmain(Stringargs)tryf();catch(MyExceptione)e.printStackTrace();tryg();catch(MyExceptione)e.printStackTrace();,继承在创建新类时发生,这里的关键是“extendsException”,它的意思是要继承Exception的所有东西,这样MyException增加的代码数量非常少,实际只添加了两个构造函数,对MyException的创建方式进行了定义。,该程序输出结果如下:ThrowingMyExceptionfromf()MyExceptionatInheriting.f(Inheriting.java:11)atInheriting.main(Inheriting.java:19)ThrowingMyExceptionfromg()MyException:Originateding()atInheriting.g(Inheriting.java:15)atInheriting.main(Inheriting.java:24),例7.15更复杂的自定义例外类,SecondInheriting.java的源文件到此为止,我们应该明白例外是一种特殊的对象,它能使程序在错误的地方安全转移,不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论