基于Java的异常处理技术及其应用.doc
《基于Java的异常处理技术及其应用.doc》由会员分享,可在线阅读,更多相关《基于Java的异常处理技术及其应用.doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目 录一 引言1二 关于JDK和JAVA异常2一Java异常定义2二Java中的异常类2三Java语言标准对异常处理的要求4三 JAVA异常的处理机制4一Java异常处理机制具体实现4二Java中异常发生的原因6三Java异常处理的优点6四 JAVA异常处理技术及其应用8一抛出异常8二捕获异常8三堆栈帧9四自定义异常11五关于图形界面程序的异常捕获12五 JAVA异常处理根本原那么14(一)不要忽略已检查型异常14(二)不要一次捕获所有的异常15(三)使用finally块释放资源16(四)异常不能影响对象的状态17(五)注意丧失或忽略的异常17(六)不要同时使用异常机制和返回值来处理异常20(
2、七)不要让try块过于庞大21六 结束语21致谢21参考文献22附录、源代码22基于Java的异常处理技术及其应用摘 要 本文以Java软件开发工具箱作为环境,通过与一些编程语言的错误处理相比拟,介绍了Java中异常处理技术的由来、定义、标准和Java内建的异常类,讨论了Java中异常产生的原因、实现,还对Java异常处理机制的优点进行了简述,就Java异常处理技术从抛出异常、捕获异常、堆栈帧、自定义异常、图形界面程序异常捕获五个方面进行了讨论。本文还就Java异常处理技术的应用做了一些探讨,试图从软件开发者的角度说明Java异常处理技术在开发中一些有价值的应用。关键词 Java语言 Java
3、异常处理 JVM 一 引言在程序设计中,尽管编写检查和处理错误的程序代码很乏味,并且它们使程序源代码显得冗长,但是,错误检测和处理仍是任何健壮应用程序最重要的组成局部之一。传统的异常处理多采用返回值来标识程序中出现的异常情况,这是程序员熟悉的一种方式,但却有很多缺点。首先,一个APIApplication Programming Interface 应用编程接口可以返回任意的返回值,而这些返回值本身并不能解释是否代表一个异常情况发生或者发生异常的具体情况,需要调用API的程序自己判断并解释返回值的含义。其次,它并没有一种机制来保证异常情况一定会得到处理,调用程序可以简单地忽略该返回值,从而需要
4、调用API的程序员记住去检测返回值并处理异常情况。这种方式还让程序代码变得晦涩冗长, 当进行容易出现异常情况的处理时,比方:I/O操作,程序中会出现很大的局部用于处理异常情况的switch分支,程序代码的可读性变得很差。相对于传统异常处理方式的缺点,Java异常处理机制提供了很好的解决方案。Java异常处理使开发人员不用编写特殊代码检测返回值就能够很容易地检测错误,并且把异常处理代码和异常产生代码明确地分开,通过抛出Java预定义或者自定义的异常,能够说明程序中出现了什么样的异常情况1;而且Java的语言机制保证了异常一定会得到恰当的处理,合理地使用异常处理机制,会让程序代码更清晰。 二 关于
5、JDK和Java异常一Java异常定义 早期的编程语言比方C语言没有异常处理,通常是遇到错误返回一个特殊的值或设定一个标志,并以此判断是不是有错误产生。随着系统规模的不断扩大,这种错误处理已经成为创立大型可维护程序的障碍了。于是在一些语言中出现了异常处理机制,比方在Basic中的异常处理语句“on error goto,而Java那么是在C+根底上建立了新的异常处理机制。Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。这种机制为复杂程序提供了强有力的控制方式。同时这些异常代码与“常规代码别离,增强了程序的可读性,编写程序时也显得更灵活。 在编译时没有问题的
6、Java源程序,在运行期可能还会发生错误,这种错误就称为异常Exception。异常也可认为是程序运行过程中违背正常指令流而产生的事件2。二Java中的异常类在Java中,所有的异常都是以类对象的形式存在的。每个异常都是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理3。Throwable是所有异常的基类,程序中一般不会直接抛出Throwable对象,Exception和Error是Throwable的子类,Exception下面又有RuntimeException和一般的Exception两类。
7、可以把Java异常分为三类:第一类是Error,Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能终止运行,例如Java虚拟机JVM出现错误。在EJBEnterprise JavaBean中将此类归为JVM 异常,这种类型的异常由 JVM 抛出。Error是一种uncheckedException未检查型异常,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常;一般情况下,在程序中也不应该抛出Error类型的异常。第二类是RuntimeException,在EJB也称为系统异常。RuntimeException是一种未检查型异常,即表示编
8、译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获未检查型异常,也不必在方法体声明抛出RuntimeException类。RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。ThrowableErrorExceptionRuntimeExceptionIOException 图21 Java异常类层次图第三类是一般的checkedException, 即已检查型异常。在EJB中称为应用程序异常。已检查型异常是在编程中使用最多的异常,所有继承自Exception并且不是Runt
9、imeException的异常都是已检查型异常,如图2-1中为Java异常的类层次图。都声明有标准异常类。这些异常类以未检查型异常类和已检查型异常类可分为如下:已检查型异常类主要有:1在java.lang中:ClassNotFoundException:指定名字的类或接口没有被发现。CloneNotSupportedException:克隆一个没有实现Cloneable接口的类。IllegalAccessException:试图使用给出了完全路径信息的字符串加载一个类,但当前正在执行的方法无法访问指定的类,原因是该类不是public类或是在另一个包中。InstantiationExceptio
10、n:试图使用Class的newInstance方法创立一个对象实例,但是,指定的对象没有被实例化,因为它是一个接口、抽象类或者一个数组。InterruptedException:当前的线程正在等待,而另一个线程那么使用了Thread的interrupt方法中断了当前线程。2在Java.io中:IOException:申请I/O操作没有成功。EOFException:在输入操作正常结束前遇到了文件结束符。FileNotFoundException:在文件系统中,没有找到由文件名字符串指定的文件。InterruptedIOException当前线程正在等待I/O操作的完成,而另一个线程使用thre
11、ad的interrupt方法中断了当前线程。未检查型异常类主要有:1在java.lang中:ArithmeticException:表示遇到了算术的异常问题,例如0作为除数。ArrayStoreException:试图把与数组类型不相符的值存入数组。ClassCastException:试图把一个对象的引用强制转换为不适宜的类型。InderOutOfBoundsException:数组的下标越界。NullPointerException:试图使用一个空的对象引用。SecurityException:检测到了违反平安的行为。2在java.util中:EmptyStaceException:试图访
12、问一个空堆栈中的一个元素。NoSuchElementException:试图访问一个空向量中的元素。三Java语言标准对异常处理的要求Java语言规定必须对已检查型异常作处理,编译器会对此作检查,要么在方法体中声明抛出已检查型异常,要么使用catch语句捕获已检查型异常进行处理,不然不能通过编译2。已检查型异常用于以下环境:1)该异常发生后是可以被恢复的,如一个Internet连接发生异常被终止后,可以重新连接再进行后续操作。2)程序依赖于不可靠的外部条件,该依赖条件可能出错,如系统I/O。3)该异常发生后并不会导致程序处理错误,进行一些处理后可以继续后续操作。Java语言标准中将任何Erro
13、r的子类以及RuntimeException的子类都称为未检查型异常。而其它异常都称为已检查型异常。三 Java异常的处理机制一Java异常处理机制具体实现在Java程序运行出现异常时,发生异常的程序段要抛出异常,而运行系统负责寻找一段代码来处理异常。Java语言中,创立一个异常对象并将它交给运行系统称为抛出一个异常,又称为异常抛出。在Java中,一个方法要抛出异常,必须遵循一定的规定,即所谓的“异常标准。异常标准采用了一个额外的关键字:throws。要使方法抛出异常,应在方法声明中,位于参变量列表的后面即throws后面列举全部潜在的异常类型。假假设Java中的某方法可能抛出一个异常,但程序
14、中没有对其进行控制,编译器会侦测到这个情况,通知程序员必须在此方法内进行异常控制,或者从方法里抛出一个异常。通过遵守异常标准,Java可在编译期保证异常处理的正确性。当Java抛出一个异常,程序将从导致异常的代码处跳出,JVM检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序, 如果没有找到处理该异常的catch块,try块中发生异常的代码不会被重新执行,在所有的finally块代码被执行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后,遇到异常的当前线程被终止。Java异常处理的语句形
15、式如下:try/正常执行的代码可能产生异常throw(异常类1 e,异常类2 e,异常类n e)catch(异常类1 e)/异常类1的处理代码catch(异常类2 e)/异常类2的处理代码catch(异常类n e)/异常类n的处理代码finally/执行去除工作的语句Java程序运行在try块中,如果产生了异常,那么不再运行try块下面的语句,而直接进入catch块中,寻找第一个与之匹配的异常类型。try/catch语句会自动在try块后面的各个catch块中,找出与该异常类相匹配的参数。如果该参数符合以下三个条件之一时,那么认为这个参数与产生的异常相匹配4。(1)参数与产生的异常属于同一个类
16、。(2)参数是产生异常的父类。(3)参数是一个接口,产生的异常实现了这一个接口。当产生的异常找到了第一个与之相匹配的参数时,就执行这一参数的catch块中的Java代码。执行完catch块后,程序恢复执行,但不会回到异常发生处继续执行而是执行try/catch结构后面的代码。finally语句可以说是为异常处理事件提供的一个清理机构。一般是用来关闭文件或者释放其他的系统资源作为try/catch/finally结构的一局部,可以没有finally块。如果存在finally块,无论try块中是否发生异常,是否执行过catch块,都要执行finally块。用finally块的一个好处,就是把方法中
17、所有去除状态和关闭系统文件的语句放在一起,不但防止代码的重复,更是减少出现遗漏语句,对于程序以后的修改也较为集中和方便。二Java中异常发生的原因异常发生有三种原因:1Java虚拟机检测到了非正常的执行状态,这些状态可能由三种因素之一引起:表达式的计算违背了Java语言的语义,例如:数组越界、除数为0等。在载入和链接Java程序时出现错误。超出了系统的资源限制,例如使用了太多的内存这些无法预知的异常。2Java程序代码中的throw语句被执行。3发生异步异常,其可能的原因有Thread类的stop方法被调用;JVM内部发生错误;运行时库出现了内部错误等。三Java异常处理的优点在面向过程的传统
18、语言中对程序中可能出现的错误一般采取:查错、报错和排错的处理错误代码和常规代码混杂在一起的方法。比方在C语言面向过程的一种编程语言中输出流的处理伪代码是:建立一个文件输入流;if(建立不成功) 报错;处理错误;else 从输入流中读入一个字符; if(读入不成功) 报错;处理错误;关闭该文件的输入流if(关闭不成功) 报错;处理错误; else else 经过这样的处理,程序可以保证正常地运行。但是程序的每一步都要考虑是否会发生错误,出现了错误又该如何处理的问题。这不但使程序代码的行数大大增加,而且,处理错误代码和正常代码混杂在一起,使程序流程变得十分复杂,不利于阅读。此外,它对于同一类型的错
19、误也不方便进行统一的处理。于上面等价实现地面向对象语言处理异常的伪代码为:try 建立一个文件输入流;读取一个字符;.;关闭该输入流;catch( 文件输入流翻开失败 ) 报错;处理错误;.; catch( 读入字符失败 ) 报错;处理错误;.面向对象语言的异常处理对于面向过程语言处理错误的方法有三种好处:其一将处理错误代码和正常代码别离;其二能够将异常沿着调用堆栈向上传播;其三能按异常类型和异常对象分组。四 Java异常处理技术及其应用一抛出异常如果有一个现成或者已定义的异常可以使用,那么抛出异常很容易。只要满足以下三点:1找到一个恰当的异常类2构造一个该类的实例3抛出该实例比方我们经常遇到
20、IOException异常发生,其中它的一个子类是EOFException,就是描述在输入过程中碰到一个未预期的文件结尾标志,我们抛出该异常的方法如下:throw new EOFException ( );或者这样:EOFException e = new EOFException ( );throw e ;二捕获异常 要想捕获一个异常,需要设置一个try/catch的代码块。try块的最简单形式如下: try codemore codecatch (ExceptionType e ) handler for this type如果try块内的任何代码抛出了由catch块中指定的异常,那么程序
21、跳过try块中的其它代码,程序执行catch块中的处理代码。假设try块没有任何代码抛出异常,那么程序会直接跳过catch块的内容。当然,可以在try块同时捕获多个异常,并分别对每种类型加以不同的处理。三堆栈帧在前,通过使用Throwable类的printStacktrace方法来获得堆栈结构的文本描叙。现在,可以通过调用getStackTrace方法来获得一个StackTraceElement对象的数组,通过研究该数组,就可以分析程序运行情况。例如:Throwable t = new Throwable ( );StackTraceElement frames = t.getStackTra
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Java 异常 处理 技术 及其 应用
限制150内