您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 股票报告 > 第六讲 异常(Exception)处理
第六讲异常(Exception)处理1、异常的概念2、异常的分类3、捕获异常4、声明异常5、抛出异常6、创建自己的异常1、异常的概念在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的鲁棒性(robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。1、异常的概念在C语言中,通过使用if语句来判断是否出现了错误,同时,调用函数通过被调用函数的返回值感知在被调用函数中产生的错误事件并进行处理。但是,这种错误处理机制会导致不少问题,因为在很多情况下需要知道错误产生的内部细节。通常,用全局变量Errno来存储一个异常事件的类型,这容易导致误用,因为一个Errno的值有可能在被处理前被另外的错误覆盖掉。此外,即使最优美的C语言程序,为了处理异常情况,也常常求助于goto语句。没有错误处理的程序:{openTheFile;determineitssize;allocatethatmuchmemory;read-filecloseTheFile;}1、异常的概念1、异常的概念以常规方法处理错误:openFiles;if(theFilesOpen){determinethelengthofthefile;if(gotTheFileLength){allocatethatmuchmemory;if(gotEnoughMemory){readthefileintomemory;if(readFailed)errorCode=-1;elseerrorCode=-2;}elseerrorCode=-3;}elseerrorCode=-4;}elseerrorCode=-5;观察前面的程序,大家会发现大部分精力花在出错处理上了只把能够想到的错误考虑到,对以外的情况无法处理程序可读性差出错返回信息量太少1、异常的概念1、异常的概念Java通过面向对象的方法来处理程序错误,在Java中,错误被称为异常(Exception)。在一个方法的运行过程中,如果发生了异常,则这个方法(或者是Java虚拟机)生成一个代表该异常的对象(包含了该异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回朔,直到找到包含相应异常处理的方法为止,这一个过程称为捕获(catch)一个异常。1、异常的概念用异常的形式处理错误:{try{openTheFile;determineitssize;allocatethatmuchmemory;read-File;closeTheFile;}catch(fileopenFailed){dosomething;}catch(sizeDetermineFailed){dosomething;}catch(memoryAllocateFailed){dosomething;}catch(readFailed){dosomething;}catch(fileCloseFailed){dosomething;}}1、异常的概念和传统的方法比较,异常的优点包括:1.把错误代码从常规代码中分离出来2.把错误传播给调用堆栈3.按错误类型和错误差别分组4.系统提供了对于一些无法预测的错误的捕获和处理5.克服了传统方法的错误信息有限的问题method1method2method3method4产生异常传递处理异常调用1、异常的概念异常示例:(1)编译时异常:在程序中必须对其进行处理,否则编译器会指出错误。(2)运行时异常:程序中可以不做处理,直接由运行时系统来处理。2、异常的分类一个异常是由一个对象来代表的,所有的异常都直接或间接地继承自Throwable类。在Java类库的每个类包中都定义了异常类,这些异常类分成两大类:Error类及Exception类,后者是Java程序中需要大量处理的。除了Java类库所定义的异常类之外,用户也可以通过继承已有的异常类来定义自己的异常类,并在程序中使用(利用throw产生,catch捕捉)。2、异常的分类ThrowableErrorExceptionRuntimeException缺省的异常处理程序由用户捕获或声明并处理不做处理用户自己产生的异常处理Error:由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,Java程序不做处理。RuntimeException:Java虚拟机在运行时生成的异常,如被0除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。因此由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。Exception:一般程序中可预知的问题,其产生的异常可能会带来意想不到的结果,因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常。2、异常的分类Java的异常处理是通过3个关键词来实现的:try-catch-finally。用try来执行一段程序,如果出现异常,系统抛出(throws)一个异常,可以通过它的类型来捕捉(catch)并处理它,或最后(finally)由缺省处理器来处理。try{//接受监视的程序块,在此区域内发生//的异常,由catch中指定的程序处理;}catch(要处理的异常种类和标识符){//处理异常;}catch(要处理的异常种类和标识符){//处理异常;}…}finally{//最终处理;}3、捕获异常3、捕获异常try语句捕获异常的第一步就是用try{…}语句指定了一段代码,该段代码就是一次捕获并处理异常的范围。在执行过程中,该段代码可能会产生并抛弃一个或多个异常,因此,它后面的catch语句进行捕获时也要做相应的处理。3、捕获异常catch语句每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的异常并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获得异常类型,运行时系统通过参数值把被抛弃的异常对象传递给catch语句。程序设计中要根据具体的情况来选择catch语句的异常处理类型,一般应该按照try代码块中异常可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为catch语句中指定要捕获的类型。当然也可以用一个catch语句处理多个异常类型,这时它的异常类型应该是这多个异常类型的父类,但这种方式使得在程序中不能确切判断异常的具体类型。publicclassExceptionDemo{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){…}3、捕获异常finally语句捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。无论try所指定的程序块中抛弃或不抛弃异常,也无论catch语句的异常类型是否与所抛弃的异常的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作,如关闭打开的文件等。try{对文件进行处理的程序;}catch(IOExceptione){//对文件异常进行处理;}finally{//不论是否发生异常,都关闭文件;}finally在文件处理时非常有用常见的异常ArithmeticExceptionArrayIndexOutOfBandsExceptionArrayStoreExceptionIOExceptionFileNotFoundExceptionNullPointerExceptionMalformedURLExceptionNumberFormatExceptionOutOfMemoryException在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译。3、捕获异常4、声明异常如果在一个方法中生成了异常,但是该方法并不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明异常。通常的情况是在该方法中并不确切知道改如何对这些异常进行处理,比如FileNotFoundException类异常,它由FileInputStream的构造方法产生,但在其构造方法中并不清楚如何处理它,是终止程序的执行还是新生成一个文件,这需要由调用它的方法来处理。声明异常的方法声明异常的方法是在产生异常的方法名后面加上要抛出(throws)的异常的列表:retTypemethodName([paramlist])throwsexceptionList如类FileInputStream中的read()方法是这样定义的:publicintread()throwsIOException{…}throws子句中可以同时指明多个异常,说明该方法将不对这些异常进行处理,而是声明抛弃它们。需要强调的是:对于非运行时异常,程序中必须要作处理,或者捕获,或者声明抛弃;而对于运行时异常,程序中则可不处理。4、声明异常publicmethod1(){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异常异常抛出处理5、抛出异常声明抛弃异常首先必须生成异常。前面所提到的异常或者是由Java虚拟机生成,或者是由Java类库中的某些类生成。事实上,我们在程序中也可以生成自己的异常对象,也即是异常可以不是出错产生,而是人为地抛出。不论那种方式,生成异常对象都是通过throw语句实现:thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;注意:抛出的异常必须是Throwable或其子类的实例。AmethodExceptionAnothermethodclassJavaThrow{publicstaticvoidmain(Stringargs[]){}try{thrownewArithmeticException();}catch(ArithmeticExceptionae){System.out.println(ae);}try{thrownewArrayIndexOutOfBoundsException();}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println(ai);}try{thrownewStringIndexOutOfBoundsException();}catch(StringIndexOutOfBoundsExceptionsi){System.o
本文标题:第六讲 异常(Exception)处理
链接地址:https://www.777doc.com/doc-3350766 .html