第12讲Java异常教学课件_第1页
第12讲Java异常教学课件_第2页
第12讲Java异常教学课件_第3页
第12讲Java异常教学课件_第4页
第12讲Java异常教学课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

异常异常Java异常的概念和处理机制捕获异常Java异常的分类已检查异常的处理抛出异常自定义异常2020/12/102异常异常示例(ExTest) lisa bily kessy Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3 atorg.broadengate.teach.j2se.exception.ExTest.main(ExTest.java:7)2020/12/103异常异常示例(ExTest)publicclassExTest{ publicstaticvoidmain(String[]args){ Stringfriends[]={"lisa","bily","kessy"}; for(inti=0;i<5;i++){ System.out.println(friends[i]); } System.out.println("\nthisistheend"); }}2020/12/104异常异常异常是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的鲁棒性,程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。什么是异常

正常情况之外的一种“异常”。在问题发生的时候,我们可能不知具体该如何解决,但肯定知道已不能不顾一切地继续下去。此时,必须坚决地停下来,并由某人、某地指出发生了什么事情,以及该采取何种对策。由于要强制捕获很多异常,开发者很难忽略他们的异常处理代码。这些异常就是我们常说的已检查异常(checked

exceptions)2020/12/105异常Java异常处理机制Java通过面向对象的方法来处理异常。Java程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这一个过程称为捕获(catch)一个例外。

如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。2020/12/106异常捕获异常(例:ExCatchTest)publicstaticvoidmain(String[]args){ Stringfriends[]={"lisa","bily","kessy"}; try{ for(inti=0;i<5;i++){ System.out.println(friends[i]); } }catch(java.lang.ArrayIndexOutOfBoundsExceptione) { System.out.println("indexerr"); } System.out.println("\nthisistheend"); }2020/12/107异常捕获异常

捕获异常是通过try-catch-finally语句实现的。try{ ...... //可能产生违例的代码}catch(ExceptionName1e){ ...... //当产生ExceptionName1型违例时的处置措施}catch(ExceptionName2e){...... //当产生ExceptionName2型违例时的处置措施}[finally{...... //无条件执行的语句 }]2020/12/108异常捕获异常try捕获违例的第一步是用try{…}语句块选定捕获违例的范围。若位于一个方法内部,并“掷”出一个异常(或在这个方法内部调用的另一个方法产生了异常),那个方法就会在异常产生过程中退出。若不想离开方法,可在那个方法内部设置一个特殊的代码块,用它捕获异常。这就叫作“try块”,因为要在这个地方“尝试”各种方法调用。try块属于一种普通的作用域,用一个try关键字开头:try{//可能产生违例的代码}catch在catch语句块中是对违例对象进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的违例对象。可能有许多catch块,每一个都处理不同的异常。

捕获例外的顺序和catch语句的顺序有关,当捕获到一个例外时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的例外,然后再逐渐一般化。也就是一般先安排子类,再安排父类。生成的异常必须在某个地方中止。这个“地方”便是异常控制器或者异常控制模块。而且针对想捕获的每种异常类型,都必须有一个相应的异常控制器。异常控制器紧接在try块后面,且用catch(捕获)关键字标记2020/12/109异常捕获所有违例捕获所有违例catch(Exceptione){

……

}

这段代码能捕获任何异常,所以在实际使用时最好将其置于控制器列表的末尾,防止跟随在后面的任何特殊异常控制器失效。2020/12/1010异常捕获异常与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。getMessage()方法,用来得到有关异常事件的信息printStackTrace()用来跟踪异常事件发生时执行堆栈的内容2020/12/1011异常finally(例:ExCatchTest2)捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。finally语句块的最重要的作用应该是释放申请的资源finally语句是任选的2020/12/1012异常异常分类2020/12/1013异常异常分类Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。Exception表示一种设计或实现问题,即如果程序运行正常,从不会发生的情况。(由程序错误导致的异常)例如:对负数开平方根空指针访问错误的数据类型等Error类被认为是不能恢复的严重错误,如系统内部错误和资源耗尽错误等。不应该抛出这种类型的错误,而是让程序中断。

------不是程序员的责任Exception类定义可能遇到的轻微错误,分为派生自IOException类的异常和非派生自RuntimeException类的异常。可以写代码来处理异常并继续程序执行,而不是让程序中断。

------是程序员的责任2020/12/1014异常异常分类Java编译器要求Java程序必须捕获或声明抛出所有的已检查异常,对未检查异常可以不做处理。未检查异常:unchecked派生于RuntimeException或Error的类的所有异常其他称为已检查异常checked

编译器将核查是否为所有已检查异常提供异常处理2020/12/1015异常捕获已检查异常(例:IoExTest1) fr=new(f); br=newBufferedReader(fr); do{ ss=ss+s+"\n"; s=br.readLine(); }while(s!=null); System.err.println("found:"+fname); if(br!=null)br.close();2020/12/1016异常捕获已检查异常(例:IoExTest1)UnhandledexceptiontypeUnhandledexceptiontypeIOExceptionUnhandledexceptiontypeIOException2020/12/1017异常捕获已检查异常(例:IoExTest2)try{ fr=new(f); br=newBufferedReader(fr); do{ ss=ss+s+"\n"; s=br.readLine(); }while(s!=null);}catch(e1){ System.err.println("found:"+fname);}catch(IOExceptione2){ e2.printStackTrace();}2020/12/1018异常特例try{//没有catch而只有finally}finally{}try{}catch(Exceptione){}//只有catch而没有finally2020/12/1019异常几个异常举例ArithmeticException:整数被0除,运算得出的结果。intI=12/0;NullPointerException:当对象没被实例化时,访问对象的属性或方法的尝试:Dated=null;System.out.println(d.toString());NegativeArraySizeException:创建带负维数大小的数组的尝试。ArrayIndexoutofBoundsException:访问超过数组大小范围的一个元素的尝试。2020/12/1020异常抛出异常如果方法中的一个语句会产生一个没有在相应的try/catch块中处理的异常,那么该方法中止执行并将异常抛出到该方法的调用程序中。这个过程要一直延续到异常被处理。如果一直到main()中仍没有被处理,那么该异常就中断程序的执行。

2020/12/1021异常抛出异常总经理---main()部门经理---xxMethod()办事员---xxMethod()上抛异常上抛异常程序中止问题解决不了,报告上级问题解决不了,报告上级问题解决不了,项目中止2020/12/1022异常声明抛出异常(ExThrowsTest)publicstaticStringbufferedRead(BufferedReaderbr)throwsIOException{ Stringss=""; Strings=""; do{ ss=ss+s+"\n"; s=br.readLine(); }while(s!=null); returnss;}

重写方法不能抛出比被重写方法范围更大的异常类型2020/12/1023异常创建并抛出异常抛出异常就是产生异常对象的过程,Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出jvm,也可根据需要需要人工创建并抛出(系统异常其实由系统自己创建和抛出,代码中不出现)(人工创建并抛出)首先要生成例外对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。IOExceptione=newIOException();throwe;为创建自己的异常类,必须从一个现有的异常类型继承——最好在含义上与新异常近似。

2020/12/1024异常自定义异常用户定义异常是通过扩展Exception类来创建的。 publicclassCarExceptionextendsException{}它包含一个构造函数、几个变量以及方法;创建并抛出自定义异常: CarExceptione=newCarException("Carisalreadyrunning---nastygrindingnoise!");e.setEngineRunning(true);throwe;2020/12/1025异常自定义异常综合示例:例:CarException自定义异常类例:NewCar 抽象类例:Porsche 实现类classMyExceptionextendsException{publicMyException(){}publicMyException(Stringmsg){super(msg);}}2020/12/1026异常自定义异常publicclassInheriting{publicstaticvoidf()throwsMyException{System.out.println("ThrowingMyExceptionfromf()");thrownewMyException();}publicstaticvoidg()throwsMyException{System.out.println("ThrowingMyExceptionfromg()");thrownewMyException("Originateding()");}publicstaticvoidmain(String[]args){try{f();}catch(MyExceptione){e.printStackTrace();}try{g();}catch(MyExceptione){e.printStackTrace();}}}2020/12/1027异常方法覆盖与异常子类的方法应该抛出范围更小(更具体的)的异常子类的方法可以抛出被覆盖方法相同的异常或其子类。2020/12/1028异常方法覆盖与异常classTestExcpt5{ publicstaticvoidmain(String[]args){ }}interfaceMyInfc1{ voidaddPerson()throwsMyExcpt2; voiddelPerson()throwsMyExcpt2,MyExcpt3;}interfaceMyInfc11extendsMyInfc1{ //voidaddPerson()throwsMyExcpt2,MyExcpt3;//子类重写的方法不能抛出比父类方法更多的异常,数量上的区别 voidaddPerson()throwsMyExcpt2; voiddelPerson()throwsMyExcpt2;//子类重写的方法抛出比父类方法更少的异常}interfaceMyInfc12extendsMyInfc1{ //voidaddPerson()throwsMyExcpt1;//子类重写的方法不能抛出父类方法的异常的父类方法,继承关系上的区别 voiddelPerson()throwsMyExcpt2,MyExcpt31;}classMyExcpt1extendsException{ MyExcpt1(){ super(); } MyExcpt1(Stringmsg){ super(msg); }}classMyExcpt2extendsMyExcpt1{ MyExcpt2(){ super(); } MyExcpt2(Stringmsg){ super("MyExcpt2:"+msg); }}classMyExcpt3extendsMyExcpt1{ MyExcpt3(){ super(); } MyExcpt3(Stringmsg){ super("MyExcpt3:"+msg); }}classMyExcpt31extendsMyExcpt3{ MyExcpt31(){ super(); } MyExcpt31(Stringmsg){ super("MyExcpt31:"+msg); }}2020/12/1029异常异常与返回值publicinttt(){try{...return5;}catch(Exceptione){...return-1;}finally{return0;}return10;}2020/12/1030异常异常与返回值publicclassTestExcp2{ publicstaticvoidmain(String[]args){ inti=TestExcp2.tt(); System.out.println("result:"); System.out.println(i);} publicstaticinttt(){ try{ System.out.println("1"); //inti=Integer.parseInt("uu"); System.out.println("3"); return2; }catch(Exceptione){ //e.printStackTrace(); //e.getMessage(); System.out.println("4"); System.out.println("5"); return5; }f

温馨提示

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

评论

0/150

提交评论