jave培训:例外(exception)处理课件_第1页
jave培训:例外(exception)处理课件_第2页
jave培训:例外(exception)处理课件_第3页
jave培训:例外(exception)处理课件_第4页
jave培训:例外(exception)处理课件_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

第六讲例外(Exception)处理1、例外的概念2、例外的分类(Throwable/Exception)3、捕获例外(try-catch-finally)4、声明例外(throws)5、抛出例外(throw)6、创建自己的例外第六讲例外(Exception)处理1、例外的概念11、例外的概念在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的鲁棒性(强壮性,robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。1、例外的概念在进行程序设计时,错误的产生是不可避免21、例外的概念在C语言中,通过使用if语句来判断是否出现了错误,同时,调用函数通过被调用函数的返回值感知在被调用函数中产生的错误事件并进行处理。但是,这种错误处理机制会导致不少问题,因为在很多情况下需要知道错误产生的内部细节。通常,用全局变量Errno来存储一个异常事件的类型,这容易导致误用,因为一个Errno的值有可能在被处理前被另外的错误覆盖掉。此外,即使最优美的C语言程序,为了处理异常情况,也常常求助于goto语句。1、例外的概念在C语言中,通过使用if语句来判断是否3没有错误处理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1、例外的概念没有错误处理的程序:1、例外的概念41、例外的概念以常规方法处理错误:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1、例外的概念以常规方法处理错误:5以常规方法处理错误存在的问题:观察前面的程序,大家会发现大部分精力花在出错处理上了只把能够想到的错误考虑到,对以外的情况无法处理程序可读性差,大量的错误处理代码混杂在程序中出错返回信息量太少,无法更确切的了解错误状况或原因1、例外的概念以常规方法处理错误存在的问题:1、例外的概念61、例外的概念Java通过面向对象的方法来处理程序错误,在Java中,错误被称为例外(Exception),有时也把例外称为异常。在一个方法的运行过程中,如果发生了例外,则这个方法(或者是Java虚拟机)生成一个代表该例外的对象(包含了该例外的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一例外。我们把生成例外对象并把它提交给运行时系统的过程称为抛弃(throw)一个例外。运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这一个过程称为捕获(catch)一个例外。1、例外的概念Java通过面向对象的方法来处理程71、例外的概念用例外的形式处理错误:{

try{

openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}

catch(fileopenFailed) {dosomething;}

catch(sizeDetermineFailed) {dosomething;}

catch(memoryAllocateFailed) {dosomething;}

catch(readFailed) {dosomething;}

catch(fileCloseFailed) {dosomething;}

finally {dosomething;}}1、例外的概念用例外的形式处理错误:81、例外的概念例外机制的优点:把错误处理代码从常规代码中分离出来按错误类型和差别分组(类Exception,派生)对无法预测的错误的捕获和处理(基类)克服了传统方法的错误信息有限的问题(getMessage)把错误传播给调用堆栈(比较:全局变量,返回值)method1method2method3method4探测抛出例外传递捕获处理例外调用1、例外的概念例外机制的优点:method1method2m91、例外的概念什么情况下使用例外机制?当方法因为自身无法控制的原因而不能完成其任务文件不存在,网络连接无法建立……处理在方法、类库、类中抛出的例外如FileInputStream.read产生IOException在大的项目中采用统一的方式处理错误时如编写一个文字处理器例外应该是不经常发生但却可能发生的故障一定发生的事件不应该用例外机制来处理例外处理用于使系统从故障中恢复提示信息/不产生无效的结果/释放资源1、例外的概念什么情况下使用例外机制?10不同的例外处理策略关键性应用(处理所有例外)实验软件(可以忽略许多例外)处理例外时的注意事项终止程序会导致资源泄漏,利用例外处理释放资源尽可能近地处理例外,这样程序清晰易读能在局部处理的错误不要使用例外机制例外机制的处理比正常处理效率低1、例外的概念不同的例外处理策略1、例外的概念111、例外的概念例外机制的关键步骤try{…}定义可能产生例外的代码段catch(Etypee){…}用于捕获一个例外finally{…}用于做统一的事后处理,如释放资源throwe;用于抛出一个例外throwsEtype1,Etype2……用于声明方法可能抛出的例外类型throw/throwstry-catch-finally1、例外的概念例外机制的关键步骤throw/throws121、例外的概念程序中的例外不外乎两种情况:一种是运行环境不能满足程序运行的要求而出错;一种是程序要解决的问题的约束而导致的。不管是哪种情况,编写程序时,程序员要考虑到程序运行时可能遇到的各种情况(条件),并进行处理;如果不能处理,或者不知该如何处理,就可以认为是一种错误,这时,就需要交给别人去处理。以前,是通过返回错误代码来提示别人程序有错误;在Java中,则是通过例外机制通知别人出错信息。1、例外的概念程序中的例外不外乎两种情况:一种是运行环境不能131、例外的概念例外机制与常规的错误处理方法的不同之处在于:1、错误的表示方法:错误编码——》对象2、错误处理方法:与常规代码的分离、错误传递机制1、例外的概念例外机制与常规的错误处理方法的不同之处在于:142、例外的分类一个例外是由一个对象来代表的,所有的例外都直接或间接地继承自Throwable类。在Java类库的每个类包中都定义了例外类,这些例外类分成两大类:Error类及Exception类,后者是Java程序中需要大量处理的。除了Java类库所定义的例外类之外,用户也可以通过继承已有的例外类来定义自己的例外类,并在程序中使用(利用throw产生,throws声明抛出,catch捕捉并处理)。2、例外的分类一个例外是由一个对象来代表的,所有15

Error:由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,Java程序不做处理。

RuntimeException:Java虚拟机在运行时生成的例外,如被0除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。因此由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。

Exception:一般程序中可预知的问题,其产生的例外可能会带来意想不到的结果,因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常。2、例外的分类Error:由Java虚拟机生成并抛出,包括动态链接失败、162、例外的分类ThrowableErrorExceptionRuntimeException缺省的例外处理程序由用户捕获或声明并处理不做处理用户自己产生的例外处理2、例外的分类ThrowableErrorException172、例外的分类

——Throwable类的方法Throwable()Throwable(Stringmessage)StringtoString()“classname”:“getMessage()”StringgetMessage()StringgetLocalizedMessage()voidprintStackTrace()voidprintStackTrace(PrintStream

s)voidprintStackTrace(PrintWriters)ThrowablefillInStackTrace()ThrowableErrorExceptionRuntimeException2、例外的分类Throwable()ThrowableErr1877:publicstaticvoidmain(String[]args){78:try{79:testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:

t.printStackTrace();86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:

thrownewThrowable("测试Throwable的用法。");138:}java.lang.Throwable:测试Throwable的用法。测试Throwable的用法。测试Throwable的用法。java.lang.Throwable:测试Throwable的用法。attest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St1977:publicstaticvoidmain(String[]args){78:try{79:

testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:

t.printStackTrace(System.err);86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:

thrownewThrowable();138:}java.lang.Throwablenullnulljava.lang.Throwableattest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St202、例外的分类

——一些常用的例外类Error(allinjava.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)…2、例外的分类Error(allinjava.lang21Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException2、例外的分类

——一些常用的例外类Exception(injava.lang)2、例外的分22RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)…2、例外的分类

——一些常用的例外类RuntimeException2、例外的分类23ExceptionIOException(injava.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOException……2、例外的分类

——一些常用的例外类Exception2、例外的分类24例外示例:(1)编译时例外:在程序中必须对其进行处理,否则编译器会指出错误。

在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译。(2)运行时例外:程序中可以不做处理,直接由运行时系统来处理。2、例外的分类例外示例:2、例外的分类25Java的例外处理是通过3个关键词来实现的:try-catch-finally。用try来监视执行一段程序,如果出现例外,系统就会抛出(throws)例外,可以通过例外的类型来捕捉(catch)并处理它,或最后(finally)由缺省处理方法来处理。3、捕获例外Java的例外处理是通过3个关键词来实现的:tr26try代码段包含可能产生例外的代码try代码段后跟有一个或多个catch代码段每个catch代码段声明其能处理的一种特定类型的例外每个catch代码段都是一段例外处理代码程序继续执行最后一个catch代码段后的代码

(或执行完finally代码段后)不同的代码段是不同的作用域,不可访问相互之间定义的局部变量try{//接受监视的程序块,在此区域内发生//的异常,由catch中指定的程序处理;}//不能有其它语句分隔catch(要处理的异常种类和标识符){//处理异常;}catch(要处理的异常种类和标识符){//处理异常;}…finally{//最终处理(缺省处理);}…//OtherStatements3、捕获例外try代码段包含可能产生例外的代码try{3、捕获例外273、捕获例外try语句

捕获例外的第一步就是用try{…}语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。在执行过程中,该段代码可能会产生并抛弃一个或多个例外,因此,它后面的catch语句进行捕获时也要做相应的处理。

如果没有例外产生,所有的catch代码段都被略过不执行。3、捕获例外try语句283、捕获例外catch语句每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的例外并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获得例外类型,运行时系统通过参数值把被抛弃的例外对象传递给catch语句。程序设计中要根据具体的情况来选择catch语句的例外处理类型,一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为catch语句中指定要捕获的类型。当然也可以用一个catch语句处理多个例外类型,这时它的例外类型应该是这多个例外类型的父类,但这种方式使得在程序中不能确切判断例外的具体类型。3、捕获例外catch语句29publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("test1.txt");intb;while((b=fis.read())!=-1){ System.out.print(b);}fis.close();

}catch(FileNotFoundExceptione){

}catch(IOExceptione){

}}}}catch(IOExceptione){…}catch(FileNotFoundExceptione){…//永远不会被执行}publicclassExceptionDemo}cat30catch(Exceptione)捕获所有Exceptioncatch(Throwablet)捕获Exception和Error例外总是由距离产生例外最近的匹配catch代码段处理如果没有相应的例外处理,则例外被交给上一层try代码段进行处理例外处理的查找依据类型匹配原则顺序进行第一个匹配的例外处理被执行,当例外处理执行完毕,程序接着最后一个catch代码段后的语句执行例外处理的顺序影响到例外的处理子类例外可被父类例外处理捕获不要先捕获父类例外,再捕获子类例外如果找不到相应的例外处理非GUI程序将结束程序执行;Applet或GUI程序则回复到事件处理状态3、捕获例外 ——catch语句catch(Exceptione)例外总是由距离产生例外313、捕获例外 ——catch语句尽量避免用一般类型作为catch中指定要捕获的类型。一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,在例外处理中无法访问try代码段中声明的变量因为此时try代码段已经退出了,例外处理所需要的任何信息一般都应该通过例外对象来传递在使用方法时尽量直接处理该方法可能产生的例外这样你的程序就会更健壮在使用库方法之前,应该先仔细阅读说明文档那里会介绍方法可能产生的例外以及例外产生的条件在使用各种例外类之前也应该先仔细阅读说明文档那里会介绍例外的具体含义及例外产生的条件3、捕获例外尽量避免用一般类型作为catch中指定要捕获的类32在catch代码段中产生的例外不是由相同try的后续catch代码段处理,而是由包含整个try-catch结构的上层try代码段检测并处理可以把catch到的例外对象再次抛出,使上层try-catch结构继续处理该例外事件;也可以把例外对象转换为其它例外对象…catch(Exceptione){throwe;}try-catch机制不该被用于流程控制,例外情形应该是很稀少的,而不是经常性的在catch代码段中的return语句用于退出方法,而不是返回到例外抛出点(throwpoint)3、捕获例外 ——catch语句在catch代码段中产生的例外不是由相同try的后续catc33publicclassTestTryCatchThrow{publicstaticvoidmain(String[]args){try{if(args.length<1){

thrownewException(“没有参数!”);}InputStreamin=newFileInputStream(args[0]);//readInt可能产生IOException,EOFExceptioninti=in.readInt();System.out.println(“对出的整数为:”+);}catch(EOFExceptione){System.out.println(“错误:文件格式存在问题!”);}catch(IOExceptione){System.out.println(“错误:文件操作中出现问题!”);}catch(Exceptione){System.out.println(“错误:”+e.getMessage());}...}}publicclassTestTryCatchThrow343、捕获例外finally语句捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。

无论try所指定的程序块中是否抛出例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。(finally语句与switch中的default语句是不同的!)通常在finally语句中可以进行资源的清除工作,如关闭打开的文件、删除临时文件等。3、捕获例外finally语句35try{

in=newFileInputStream(“file1.txt”);对文件进行处理的程序;}catch(IOExceptione){//对文件异常进行处理;}finally{//不论是否发生异常,都关闭文件;}finally在文件处理时非常有用例外的覆盖finally代码段中应该把可能产生例外的语句用try-catch保护起来if(in!=null){try{in.close();}catch(IOExceptione){…}}//使用try-catch结构,防止finally代码段抛出例外try{finally在文件处理时非常有用例外的覆盖if36如果在一个方法中生成了例外,但是该方法并不处理它产生的例外,而是沿着调用层次向上传递,交由调用它的方法来处理这些例外,这就是声明例外。通常的情况是在该方法中并不确切知道改如何对这些例外进行处理,比如FileNotFoundException类例外,它由FileInputStream的构造方法产生,但在其构造方法中并不清楚如何处理它,是终止程序的执行还是新生成一个文件,这需要由调用它的方法来处理。4、声明例外(throws语句)如果在一个方法中生成了例外,但是该方法并不处理它产生的37声明例外的方法声明例外的方法是在产生异常的方法名后面加上要抛出(throws)的例外的列表:retTypemethodName([paramlist])throwsexceptionList如类FileInputStream中的read()方法是这样定义的:publicintread()throwsIOException{…}throws子句中可以同时指明多个例外,说明该方法将不对这些例外进行处理,而是声明抛弃它们。需要强调的是:对于非运行时例外,程序中必须要作处理,或者捕获,或者声明抛弃;而对于运行时例外,程序中则可不处理。4、声明例外(throws语句)声明例外的方法4、声明例外(throws语句)38publicmethod1(){intx;try{x=System.in.read();compute(x);}catch(IOExceptionioe){System.out.println(“readerror”);}catch(ArithmeticExceptione){System.out.println(“devidedby0”);}}publicintcompute(intx)throwsArithmeticException{intz=100/x;returnz;}method1compute异常例外抛出处理调用publicmethod1()publicintco39非运行时例外Throwable、Exception运行时例外Error、RuntimeException当在一个方法的代码中抛出一个受检查的例外时,这个例外或者被方法中的try-catch结构捕获,或者在方法的throws语句中声明编译器检查程序,保证所有非运行时例外都被程序显式地处理ThrowableErrorExceptionRuntimeException4、声明例外(throws语句)非运行时例外ThrowableErrorExceptionR405、抛出例外(throw语句)声明例外首先必须生成例外。前面所提到的例外或者是由Java虚拟机生成,或者是由Java类库中的某些类生成。事实上,我们在程序中也可以生成自己的例外对象,也即是例外可以不是出错产生,而是人为地抛出。不论那种方式,生成例外对象都是通过throw语句实现:

thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;注意:抛出的例外必须是Throwable或其子类的实例。AmethodExceptionAnothermethod5、抛出例外(throw语句)声明例外首先必须生成例41classJavaThrow{ publicstaticvoidmain(Stringargs[]) {}try{thrownewArithmeticException();}catch(ArithmeticExceptionae){System.out.println(ae);}try{thrownewArrayIndexOutOfBoundsException();}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println(ai);}try{thrownewStringIndexOutOfBoundsException();}catch(StringIndexOutOfBoundsExceptionsi){System.out.println(si);}classJavaThrowtrytrytry42任何从Throwable派生的类都可以用throw语句抛出,抛出例外用来表明程序遇到的错误无法正常执行而需要例外处理thrownewMyException(“someinfomation”);例外可以由try代码段中的语句抛出也可以从被try代码段中调用的方法中抛出例外还可能产生于数组下标越界以及Java虚拟机内部错误等Exception和Error是Throwable的直接派生类Exception,程序应该处理的例外Error代表系统严重错误,一般程序不处理这类错误例外抛出点后的代码在抛出例外后不再执行也可以说例外的抛出终止了代码段的执行5、抛出例外(throw语句)任何从Throwable派生的类都可以用throw语句抛出,436、创建自己的例外当我们在设计自己的类包时,应尽最大的努力为用户提供最好的服务,并且希望用户不要滥用我们所提供的方法,当程序出现某些异常事件时,我们希望程序足够健壮以从程序中恢复,这时就需要用到例外。在选择例外类型时,可以使用Java类库中已经定义好的类,也可以自己定义例外类。自定义例外类不是由Java系统监测到的例外(如数组下标越界,被0除等),而是由用户自己定义的例外。自定义例外同样要用try-catch-finally捕获,但必须由用户自己抛出(throw)。6、创建自己的例外当我们在设计自己的类包时,应尽44例外是一个类,自定义例外必须继承自Throwable或Exception类。建议:

例外一定是不经常发生的故障,应避免把控制流程作为例外处理尽量使用JDK提供的例外类:重用、便于理解用Exception/RuntimeException类:编译时例外、运行时例外。一般不把自定义例外作为Error的子类,因为Error通常被用来表示系统内部的严重故障。ThrowableErrorExceptionRuntimeException自定义例外处理例外是一个类,自定义例外必须继承自Throwab456、创建自己的例外当自定义例外是从RuntimeException及其子类继承而来时,该自定义例外是运行时例外,程序中可以不捕获并处理它。当自定义例外是从Throwable、Exception及其其他子类继承而来时,该自定义例外是编译时例外,也即程序中必须捕获并处理它。自定义例外的形式:classMyExceptionextendsException{…}6、创建自己的例外当自定义例外是从RuntimeEx466、创建自己的例外例1:计算两个数之和,当任意一个数超出范围时,抛出自己的例外。publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}6、创建自己的例外例1:计算两个数之和,当任意一47publicintCalcAnswer(Stringstr1,Stringstr2)throwsNumberRangeException{intint1,int2;intanswer=-1;try{int1=Integer.parseInt(str1);int2=Integer.parseInt(str2);if((int1<10)||(int1>20)||(int2<10)||(int2>20))

{NumberRangeExceptione=newNumberRangeException("Numbersnotwithinthespecifiedrange.");throwe;}answer=int1+int2;}catch(NumberFormatExceptione){System.out.println(e.toString());}returnanswer;}publicintCalcAnswer(Strings48publicvoidgetAnswer(){StringanswerStr;try{intanswer=CalcAnswer(“12”,“5”);answerStr=String.valueOf(answer);}catch(NumberRangeExceptione){answerStr=e.getMessage();}System.out.println(answerStr);}publicvoidgetAnswer()496、创建自己的例外例2:在定义银行类时,若取钱数大于余额则作为异常处理(InsufficientFundsException)。思路:产生例外的条件是余额少于取额,因此是否抛出例外要先判断该条件。确定产生例外的方法,应该在取钱方法(withdrawal)中产生例外InsufficientFundsException。处理例外安排在调用withdrawal的时候,因此withdrawal方法要声明例外,由上级方法捕获并处理。要定义好自己的例外。6、创建自己的例外例2:在定义银行类时,若取钱数大于余额则作50publicclassInsufficientFundsExceptionextendsException{privateBankexcepbank;privatedoubleexcepAmount;

InsufficientFundsException(Bankba,doubledAmount){excepbank=ba;excepAmount=dAmount;}publicStringexcepMesagge(){Stringstr=“Thebalance”+excepbank.getbalance()+“Thewithdrawalwas”+excepAmount;returnstr;}}publicclassInsufficientFunds51classBank{doublebalance;//余额Bank(doubleb){balance=b;}publicvoiddeposite(doubledAmount)//存钱{if(dAmount>0.0)balance+=dAmount;}publicvoidwithdrawal(doubledAmount)throwsInsufficientFundsException{if(balance<dAmout){

thrownewInsufficientFundsException(this,dAmount);}balance=balance-dAmount;}publicdoublegetbalance()//获取余额{returnbalance;}}classBank52publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{Bankba=newBank(50);ba.withdrawal(100);System.out.println(“Withdrawalsuccessful!”);}catch(Exceptione){System.out.println(e.toString());}}}publicclassExceptionDemo53小结例外处理的一般格式:Java的例外处理机制使得处理例外的代码和“常规”代码分开,减少了代码的数量,增强了程序的可读性(可以对比用if语句来处理例外的情形,这时需要进行一系列条件的判定)。try{

Javastatement;}catche(ExceptionType1ExceptionObject1){

ExceptionObject1handling;}catche(ExceptionType2ExceptionObject2){

ExceptionObject2handling;}…}finally{

finalhandling;//统一的出口,最终必定要执行}小结例外处理的一般格式:Java的例外处理机制使得处理例外54

Java的例外处理机制使得例外事件可以沿调用堆栈自动向上传播,沿着被调用的顺序往前寻找,只要找到符合该例外种类的例外处理程序,就交给这部分程序去处理。而不是C语言中通过函数的返回值来传播,这样可以传递更多的信息并且简化代码的编写。小结Method1Method2Method3Read-filecallcallcalltry-catch产生异常throwsthrowsthrowsJava的例外处理机制使得例外事件可以沿调用堆栈自动向上传55小结Java通过面向对象的方法进行例外处理,把各种不同的例外事件进行分类,体现了良好的层次性,提供了良好的接口,这种机制对于具有动态运行特性的复杂程序提供了强有力的控制。由于把例外事件当成对象来处理,利用类的层次性可以把多个具有相同父类的例外统一处理,也可以区分不同的例外分别处理,使用非常灵活。当然,从另一方面来看,在捕获或声明例外时,要选取合适类型的例外类,注意例外的类层次,根据不同的情况使用一般或特殊的例外类。应该根据具体的情况选择在何处处理例外。或者在方法内捕获并处理,或者用throws子句把它交给调用栈中上层的方法去处理。小结Java通过面向对象的方法进行例外处理,把各种不同的例56对非运行时例外(编译时例外)必须捕获或声明。对运行时例外,若不能预测它何时发生,程序可不作处理,而是交给Java运行时系统来处理;若能预知它可能发生的地点和时间,则应在程序中处理,而不应简单地交给运行时系统。例外可以人为地抛出,用thrownewExceptionType()语句。例外可以是系统已经定义好的,也可以是用户自己定义的。用户自己定义的例外一定要继承自Throwable或Exception等类。在自定义例外类时,如果它所对应的异常事件通常总是在运行时产生,而且不容易预测它将在何时何地发生,可以将它定义为运行时例外,否则应定义为非运行时(编译时)例外。应该使用finally语句为例外处理提供统一的出口。小结对非运行时例外(编译时例外)必须捕获或声明。对运行时例外,57演讲完毕,谢谢观看!演讲完毕,谢谢观看!58第六讲例外(Exception)处理1、例外的概念2、例外的分类(Throwable/Exception)3、捕获例外(try-catch-finally)4、声明例外(throws)5、抛出例外(throw)6、创建自己的例外第六讲例外(Exception)处理1、例外的概念591、例外的概念在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的鲁棒性(强壮性,robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。1、例外的概念在进行程序设计时,错误的产生是不可避免601、例外的概念在C语言中,通过使用if语句来判断是否出现了错误,同时,调用函数通过被调用函数的返回值感知在被调用函数中产生的错误事件并进行处理。但是,这种错误处理机制会导致不少问题,因为在很多情况下需要知道错误产生的内部细节。通常,用全局变量Errno来存储一个异常事件的类型,这容易导致误用,因为一个Errno的值有可能在被处理前被另外的错误覆盖掉。此外,即使最优美的C语言程序,为了处理异常情况,也常常求助于goto语句。1、例外的概念在C语言中,通过使用if语句来判断是否61没有错误处理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1、例外的概念没有错误处理的程序:1、例外的概念621、例外的概念以常规方法处理错误:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;1、例外的概念以常规方法处理错误:63以常规方法处理错误存在的问题:观察前面的程序,大家会发现大部分精力花在出错处理上了只把能够想到的错误考虑到,对以外的情况无法处理程序可读性差,大量的错误处理代码混杂在程序中出错返回信息量太少,无法更确切的了解错误状况或原因1、例外的概念以常规方法处理错误存在的问题:1、例外的概念641、例外的概念Java通过面向对象的方法来处理程序错误,在Java中,错误被称为例外(Exception),有时也把例外称为异常。在一个方法的运行过程中,如果发生了例外,则这个方法(或者是Java虚拟机)生成一个代表该例外的对象(包含了该例外的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一例外。我们把生成例外对象并把它提交给运行时系统的过程称为抛弃(throw)一个例外。运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这一个过程称为捕获(catch)一个例外。1、例外的概念Java通过面向对象的方法来处理程651、例外的概念用例外的形式处理错误:{

try{

openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}

catch(fileopenFailed) {dosomething;}

catch(sizeDetermineFailed) {dosomething;}

catch(memoryAllocateFailed) {dosomething;}

catch(readFailed) {dosomething;}

catch(fileCloseFailed) {dosomething;}

finally {dosomething;}}1、例外的概念用例外的形式处理错误:661、例外的概念例外机制的优点:把错误处理代码从常规代码中分离出来按错误类型和差别分组(类Exception,派生)对无法预测的错误的捕获和处理(基类)克服了传统方法的错误信息有限的问题(getMessage)把错误传播给调用堆栈(比较:全局变量,返回值)method1method2method3method4探测抛出例外传递捕获处理例外调用1、例外的概念例外机制的优点:method1method2m671、例外的概念什么情况下使用例外机制?当方法因为自身无法控制的原因而不能完成其任务文件不存在,网络连接无法建立……处理在方法、类库、类中抛出的例外如FileInputStream.read产生IOException在大的项目中采用统一的方式处理错误时如编写一个文字处理器例外应该是不经常发生但却可能发生的故障一定发生的事件不应该用例外机制来处理例外处理用于使系统从故障中恢复提示信息/不产生无效的结果/释放资源1、例外的概念什么情况下使用例外机制?68不同的例外处理策略关键性应用(处理所有例外)实验软件(可以忽略许多例外)处理例外时的注意事项终止程序会导致资源泄漏,利用例外处理释放资源尽可能近地处理例外,这样程序清晰易读能在局部处理的错误不要使用例外机制例外机制的处理比正常处理效率低1、例外的概念不同的例外处理策略1、例外的概念691、例外的概念例外机制的关键步骤try{…}定义可能产生例外的代码段catch(Etypee){…}用于捕获一个例外finally{…}用于做统一的事后处理,如释放资源throwe;用于抛出一个例外throwsEtype1,Etype2……用于声明方法可能抛出的例外类型throw/throwstry-catch-finally1、例外的概念例外机制的关键步骤throw/throws701、例外的概念程序中的例外不外乎两种情况:一种是运行环境不能满足程序运行的要求而出错;一种是程序要解决的问题的约束而导致的。不管是哪种情况,编写程序时,程序员要考虑到程序运行时可能遇到的各种情况(条件),并进行处理;如果不能处理,或者不知该如何处理,就可以认为是一种错误,这时,就需要交给别人去处理。以前,是通过返回错误代码来提示别人程序有错误;在Java中,则是通过例外机制通知别人出错信息。1、例外的概念程序中的例外不外乎两种情况:一种是运行环境不能711、例外的概念例外机制与常规的错误处理方法的不同之处在于:1、错误的表示方法:错误编码——》对象2、错误处理方法:与常规代码的分离、错误传递机制1、例外的概念例外机制与常规的错误处理方法的不同之处在于:722、例外的分类一个例外是由一个对象来代表的,所有的例外都直接或间接地继承自Throwable类。在Java类库的每个类包中都定义了例外类,这些例外类分成两大类:Error类及Exception类,后者是Java程序中需要大量处理的。除了Java类库所定义的例外类之外,用户也可以通过继承已有的例外类来定义自己的例外类,并在程序中使用(利用throw产生,throws声明抛出,catch捕捉并处理)。2、例外的分类一个例外是由一个对象来代表的,所有73

Error:由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,Java程序不做处理。

RuntimeException:Java虚拟机在运行时生成的例外,如被0除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。因此由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。

Exception:一般程序中可预知的问题,其产生的例外可能会带来意想不到的结果,因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常。2、例外的分类Error:由Java虚拟机生成并抛出,包括动态链接失败、742、例外的分类ThrowableErrorExceptionRuntimeException缺省的例外处理程序由用户捕获或声明并处理不做处理用户自己产生的例外处理2、例外的分类ThrowableErrorException752、例外的分类

——Throwable类的方法Throwable()Throwable(Stringmessage)StringtoString()“classname”:“getMessage()”StringgetMessage()StringgetLocalizedMessage()voidprintStackTrace()voidprintStackTrace(PrintStream

s)voidprintStackTrace(PrintWriters)ThrowablefillInStackTrace()ThrowableErrorExceptionRuntimeException2、例外的分类Throwable()ThrowableErr7677:publicstaticvoidmain(String[]args){78:try{79:testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:

t.printStackTrace();86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:

thrownewThrowable("测试Throwable的用法。");138:}java.lang.Throwable:测试Throwable的用法。测试Throwable的用法。测试Throwable的用法。java.lang.Throwable:测试Throwable的用法。attest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St7777:publicstaticvoidmain(String[]args){78:try{79:

testThrowable();80:}81:catch(Throwablet){82:System.err.println(t.toString());83:System.err.println(t.getMessage());84:System.err.println(t.getLocalizedMessage());85:

t.printStackTrace(System.err);86:}87:}…136:staticvoidtestThrowable()throwsThrowable{137:

thrownewThrowable();138:}java.lang.Throwablenullnulljava.lang.Throwableattest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)77:publicstaticvoidmain(St782、例外的分类

——一些常用的例外类Error(allinjava.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)…2、例外的分类Error(allinjava.lang79Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException2、例外的分类

——一些常用的例外类Exception(injava.lang)2、例外的分80RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)…2、例外的分类

——一些常用的例外类RuntimeException2、例外的分类81ExceptionIOException(injava.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOException……2、例外的分类

——一些常用的例外类Exception2、例外的分类82例外示例:(1)编译时例外:在程序中必须对其进行处理,否则编译器会指出错误。

在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译。(2)运行时例外:程序中可以不做处理,直接由运行时系统来处理。2、例外的分类例外示例:2、例外的分类83Java的例外处理是通过3个关键词来实现的:try-catch-finally。用try来监视执行一段程序,如果出现例外,系统就会抛出(throws)例外,可以通过例外的类型来捕捉(catch)并处理它,或最后(finally)由缺省处理方法来处理。3、捕获例外Java的例外处理是通过3个关键词来实现的:tr84try代码段包含可能产生例外的代码try代码段后跟有一个或多个catch代码段每个catch代码段声明其能处理的一种特定类型的例外每个catch代码段都是一段例外处理代码程序继续执行最后一个catch代码段后的代码

(或执行完finally代码段后)不同的代码段是不同的作用域,不可访问相互之间定义的局部变量try{//接受监视的程序块,在此区域内发生//的异常,由catch中指定的程序处理;}//不能有其它语句分隔catch(要处理的异常种类和标识符){//处理异常;}catch(要处理的异常种类和标识符){//处理异常;}…finally{//最终处理(缺省处理);}…//OtherStatements3、捕获例外try代码段包含可能产生例外的代码try{3、捕获例外853、捕获例外try语句

捕获例外的第一步就是用try{…}语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。在执行过程中,该段代码可能会产生并抛弃一个或多个例外,因此,它后面的catch语句进行捕获时也要做相应的处理。

如果没有例外产生,所有的catch代码段都被略过不执行。3、捕获例外try语句863、捕获例外catch语句每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的例外并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获得例外类型,运行时系统通过参数值把被抛弃的例外对象传递给catch语句。程序设计中要根据具体的情况来选择catch语句的例外处理类型,一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为catch语句中指定要捕获的类型。当然也可以用一个catch语句处理多个例外类型,这时它的例外类型应该是这多个例外类型的父类,但这种方式使得在程序中不能确切判断例外的具体类型。3、捕获例外catch语句87publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("test1.txt");intb;while((b=fis.read())!=-1){ System.out.print(b);}fis.close();

}catch(FileNotFoundExceptione){

}catch(IOExceptione){

}}}}catch(IOExceptione){…}catch(FileNotFoundExceptione){…//永远不会被执行}publicclassExceptionDemo}cat88catch(Exceptione)捕获所有Exceptioncatch(Throwablet)捕获Exception和Error例外总是由距离产生例外最近的匹配catch代码段处理如果没有相应的例外处理,则例外被交给上一层try代码段进行处理例外处理的查找依据类型匹配原则顺序进行第一个匹配的例外处理被执行,当例外处理执行完毕,程序接着最后一个catch代码段后的语句执行例外处理的顺序影响到例外的处理子类例外可被父类例外处理捕获不要先捕获父类例外,再捕获子类例外如果找不到相应的例外处理非GUI程序将结束程序执行;Applet或GUI程序则回复到事件处理状态3、捕获例外 ——catch语句catch(Exceptio

温馨提示

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

评论

0/150

提交评论