异常处理课件_第1页
异常处理课件_第2页
异常处理课件_第3页
异常处理课件_第4页
异常处理课件_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

异常处理异常异常的概念异常的分类捕获异常声明异常抛出异常创造自己的异常总结异常处理

异常的概念什么是异常?

异常实际上是程序中错误导致中断了正常的指令流的一种事件.没有处理错误的程序:

read-file{openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}异常处理异常的概念以常规方法处理错误

openFiles;if(the){determinethelenthofthefile;if(gotThe){allocatethatmuchmemory;if(gotEnoughMemory){readthememory;if(readFailed)errorCode=-1;elseerrorCode=1;}elseerrorCode=-3;}elseerrorCode=-5;}elseerrorCode=-5;异常处理

异常的概念观察前面的程序你会发现大部分精力花在出错处理上了.只把能够想到的错误考虑到,对以外的情况无法处理程序可读性差出错返回信息量太少异常处理

异常的概念用异常的形式处理错误read-File;{try{

openTheFile;determineitssize;allocatethatmuchmemory;closeTheFile;}catch(){dosomething;}catch(sizeDetermineFailed){dosomething;}catch(memoryAllocateFailed){dosomething;}catch(readFailed){dosomething;}catch(){dosomething;}catch(Exception){dosomething;}//其它未考虑到的错误

}异常处理异常的概念和传统的方法比较异常的优点:1.把错误代码从常规代码中分离出来2.把错误传播给调用堆栈3.按错误类型和错误差别分组4.系统提供了对于一些无法预测的错误的捕获和处理5.克服了传统方法的错误信息有限的问题method1method2method3method4探测抛出例外传递捕获处理例外调用异常处理什么情况下使用例外机制?当方法因为自身无法控制的原因而不能完成其任务文件不存在,网络连接无法建立……处理在方法、类库、类中抛出的例外如产生IOException在大的项目中采用统一的方式处理例外时如编写一个文字处理器例外应该是不经常发生但却可能发生的故障一定发生的事件不应该用例外机制来处理例外处理用于使系统从故障中恢复提示信息/不产生无效的结果/释放资源异常的概念异常处理不同的例外处理策略关键性应用(处理所有例外)实验软件(可以忽略许多例外)处理例外时的注意事项终止程序会导致资源泄漏,利用例外处理释放资源尽可能近地处理例外,这样程序清晰易读能在局部处理的错误不要使用例外机制例外机制的处理比正常处理效率低异常的概念异常处理

异常的概念.classExcepTest{publicvoidmain(Stringargs[]){intb=0;inta;try{a=5/b;}catch(ArithmeticExceptione){System.out.println(“dividedby0”);}}}try{URLurl=newURL(”,”hit.gif”);}catch(MalformedURLExceptione){badURL=true;repaint();}异常处理异常的分类异常是一个对象,它继承自Throwable类,所有的Throwable类的子孙类所产生的对象都是例外.Error:由Java虚拟机生成并抛出,Java程序不做处理.RuntimeException(被0除等系统错误,数组下标超范围):由系统检测,用户的Java程序可不做处理,系统将它们交给缺省的异常处理程序.Exception(程序中的问题,可预知的):Java编译器要求Java程序必须捕获或声明所有的非运行时异常throw:用户自己产生异常异常处理异常的分类异常处理异常的分类.ThrowableErrorExceptionRuntimeException缺省的异常处理程序由用户捕获或声明并处理不做处理用户自己产生的异常要处理异常处理例外的分类

一个例外是由一个对象来代表的,所有的例外都直接或间接地继承自Throwable类。在Java类库的每个类包中都定义了例外类,这些例外类分成两大类:Error类及Exception类,后者是Java程序中需要大量处理的。除了Java类库所定义的例外类之外,用户也可以通过继承已有的例外类来定义自己的例外类,并在程序中使用(利用throw产生,throws声明抛出,catch捕捉并处理)。异常处理

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

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

Exception:一般程序中可预知的问题,其产生的例外可能会带来意想不到的结果,因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常。例外的分类异常处理publicstaticvoidmain(String[]args){try{testThrowable();}catch(Throwablet){System.err.println(t.toString());System.err.println(t.getMessage());System.err.println(t.getLocalizedMessage());

t.printStackTrace();}}…staticvoidtestThrowable()throwsThrowable{

thrownewThrowable("测试Throwable的用法。");}java.lang.Throwable:测试Throwable的用法。测试Throwable的用法。测试Throwable的用法。java.lang.Throwable:测试Throwable的用法。

attest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)异常处理publicstaticvoidmain(String[]args){try{

testThrowable();}catch(Throwablet){System.err.println(t.toString());System.err.println(t.getMessage());System.err.println(t.getLocalizedMessage());

t.printStackTrace(System.err);}}…staticvoidtestThrowable()throwsThrowable{

thrownewThrowable();}java.lang.Throwablenullnulljava.lang.Throwableattest.Untitled1.testThrowable(Untitled1.java:137)attest.Untitled1.main(Untitled1.java:79)异常处理

例外示例:(1)编译时例外:在程序中必须对其进行处理,否则编译器会指出错误。

在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译。(2)运行时例外:程序中可以不做处理,直接由运行时系统来处理。例外的分类异常处理捕获异常捕获并处理异常try{//接受监视的程序块,在此区域内发生

//的异常,由catch中指定的程序处理;}//不能有其它语句分隔catch(要处理的异常种类和标识符){//处理异常;}catch(要处理的异常种类和标识符){//处理异常;}异常处理捕获例外try语句

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

如果没有例外产生,所有的catch代码段都被略过不执行。异常处理捕获例外catch语句每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的例外并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获得例外类型,运行时系统通过参数值把被抛弃的例外对象传递给catch语句。程序设计中要根据具体的情况来选择catch语句的例外处理类型,一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为catch语句中指定要捕获的类型。当然也可以用一个catch语句处理多个例外类型,这时它的例外类型应该是这多个例外类型的父类,但这种方式使得在程序中不能确切判断例外的具体类型。异常处理catch(Exceptione)

捕获所有Exceptioncatch(Throwablet)

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

——catch语句异常处理捕获例外

——catch语句尽量避免用一般类型作为catch中指定要捕获的类型。一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,在例外处理中无法访问try代码段中声明的变量因为此时try代码段已经退出了,例外处理所需要的任何信息一般都应该通过例外对象来传递在使用方法时尽量直接处理该方法可能产生的例外这样你的程序就会更健壮在使用库方法之前,应该先仔细阅读说明文档那里会介绍方法可能产生的例外以及例外产生的条件在使用各种例外类之前也应该先仔细阅读说明文档那里会介绍例外的具体含义及例外产生的条件异常处理在catch代码段中产生的例外不是由相同try的后续catch代码段处理,而是由包含整个try-catch结构的上层try代码段检测并处理可以把catch到的例外对象再次抛出,使上层try-catch结构继续处理该例外事件;也可以把例外对象转换为其它例外对象…catch(Exceptione){throwe;}try-catch机制不该被用于流程控制,例外情形应该是很稀少的,而不是经常性的在catch代码段中的return语句用于退出方法,而不是返回到例外抛出点(throwpoint)捕获例外

——catch语句异常处理

捕获异常常见的异常ArithmeticException//算术异常比如被零除ArrayIndexOutOfBoundsException//数组下标越界ArrayStoreException//放入数组的类型不符IOException//I/O异常//找不到文件异常NullPointerException//空指针异常MalformedURLException//url无法解析异常NumberFormatException//字符串转换数值异常如果在使用能够产生异常的方法而没有捕获和处理,将不能通过编译异常处理

捕获异常例:编写Java程序,包含三种异常算术异常,字符串越界,数组越界观察输出信息:每个异常对象可以直接给出信息异常处理捕获异常classfirst_exception{ publicstaticvoidmain(Stringargs[]) {charc;inta,b=0;int[]array=newint[7];Strings="Hello";

try{a=1/b;}catch(ArithmeticExceptionae){System.out.println(“Catch“+ae));}try{array[8]=0;}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println((“Catch“+ai);}

try{c=s.charAt(8));}catch(StringIndexOutOfBoundsExceptionse){System.out.println((“Catch“+se);}}}异常处理

捕获异常一定会执行的程序块---finally异常处理的统一出口try{//常规的代码;}catch(){//处理异常}finally{//不论发生什么异常(或者不发生任何异常),都要执行的部分;}异常处理捕获例外finally语句捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。

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

声明异常一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明异常.声明异常的方法在产生异常的方法名后面加上要抛出(throws)的异常的列表voidcompute(intx)throwsArithmeticException{…}returnTypemethodName([parameterlist])throwsexceptionList异常处理

声明异常例:若因某种原因不想在创建URL的方法中处理异常publicmethod1(){intx;try{x=System.in.read();compute(x);}catch(IOExceptionioe){System.out.println(“readerror”);}catch(ArithmeticExceptione){System.out.println(“devidedby0”);}}publicintcompute(intx)throwsArithmeticExceptione){returnz=100/x;}异常处理声明异常method1computer异常抛出处理异常处理

声明异常例:说出程序执行结果publicclassexception1{voidProc(intsel)throwsArithmeticException,ArrayIndexOutOfBoundsException{System.out.println(“InSituation"+sel);if(sel==0){System.out.println("noExceptioncaught");return;}elseif(sel==1){intiArray[]=newint[5];iArray[10]=3;}}异常处理声明异常publicstaticvoidmain(Stringargs[]){try{Proc(0);Proc(1);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Catch"+e);}}

c:>javathrowsExceptionInSituation0noExceptioncaughtInSituation1Catchjava.lang.ArrayIndexOutOfBoundsException:10异常处理

抛出异常抛弃异常:不是出错产生,而是人为地抛出throwThrowableObject;thrownewArithmeticException();例:编写程序人为抛出(JavaThrow.prj)ArithmeticException,ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionAmethodExceptionAnothermethodthrowcaught异常处理

抛出异常classJavaThrow{ 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);}异常处理任何从Throwable派生的类对象都可以用throw语句抛出,抛出例外用来表明程序遇到的错误无法正常执行而需要例外处理thrownewMyException(“someinfomation”);例外可以由try代码段中的语句抛出也可以从被try代码段中调用的方法中抛出例外还可能产生于数组下标越界以及Java虚拟机内部错误等Exception和Error是Throwable的直接派生类Exception,程序应该处理的例外Error代表系统严重错误,一般程序不处理这类错误例外抛出点后的代码在抛出例外后不再执行也可以说例外的抛出终止了代码段的执行抛出例外(throw语句)异常处理

创造自己的异常不是由Java系统监测到的异常(下标越界,被0-除等),而是由用户自己定义的异常.用户定义的异常同样要用try--catch捕获,但必须由用户自己抛出thrownewMyException.异常是一个类,用户定义的异常必须继承自Throwable或Exception类,建议用Exception类.异常处理

创造自己的异常形如:classMyExceptionextendsException{….};例1:计算两个数之和,当任意一个数超出范围时,抛出自己的异常publicclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}异常处理publicintCalcAnswer(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;}cat

温馨提示

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

评论

0/150

提交评论