资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
基于Java语言的异常处理机制的研究 作者: 日期:基于Java语言的异常处理机制的研究摘要:Java是一种面向对象的程序设计语言,其异常处理机制是Java语言的一大特色。本文讨论了Java的异常处理机制,并指出了异常处理机制使用中的常见错误模式及注意事项,以便更好的利用Java解决实际问题。关键字:Java; 异常; 异常处理机制; 错误模式引言:异常是一个运行时错误。在不支持异常处理的计算机语言中,错误必须被手工检查和处理典型的是通过错误代码的运用等等,这种方法既笨重又麻烦。Java的异常处理机制避免了这些问题,采用面向对象的方法来管理运行时错误。1、 异常处理思想的由来异常即程序运行时出现的非正常情况。在程序的运行过程中随时都有可能发生错误的可能。这些错误可能是由于包含不合法的输入数据所造成的,或者是数组越界存取,还可能是因为试图使用空引用来引用对象。当这些错误发生时,通常希望程序能够智能化地处理,而不会导致系统的崩溃或数据的丢失。错误处理的终极任务就是将错误从发生地传递到能够处理它的地方。导致产生错误传统的非面向对象的编程语言程序员负担过重出错处理不规范由程序员考虑并自行处理 图1、传统的错误处理方式在传统的非面向对象的编程语言中,错误处理的任务全落在程序员身上,这样做有两个去缺点,一是程序员的负担过重,二是出错处理不规范,不利于程序员之间的协作沟通,而且降低了程序的可读性。在Java中使用异常为程序提供了一种有效的错误处理方式,使得方法的异常中止和错误处理有了一个清晰的接口:当一个方法引发一个异常之后,可以将异常抛出,由该方法的直接或间接调用者处理这个异常。这就是常说的catch-throw(捕获-抛出)方式。这种处理方式使得错误的处理规范化, 程序员可以用一致的方式来处理错误。2、 Java的异常处理机制Java异常处理机制基于三中操作:声明异常、抛出异常和捕获异常。具体见图2。抛出异常声明异常捕获异常寻找异常处理器异常发生,则创建异常对象并传递给系统方法说明它可能遇到的异常类型图2、异常处理机制的操作流程声明异常告诉编译程序哪里可能出错。当一个语句引起错误时,含有这个语句的方法就会创建一个异常对象并将它传递给系统。异常对象包含有关异常的信息,包括它的类型和出错时程序的状态。一个方法抛出异常后,Java运行系统开始寻找用来处理错误的代码。处理错误的代码称为异常处理器,从当前的方法开始,通过方法调用链向后搜索,查找这一代码。处理器必须与抛出的异常类型相匹配,如果未发现异常处理器,程序就会中止。任何不是被你程序捕获的异常最终都会被系统提供的默认处理程序处理。默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序。 3、 Java异常处理机制的规则具体而言Java的异常处理通过5个关键字控制:try、catch、throw、throws和finally。想要进行异常监控的代码被包含在一个try块中。如果在“try”块中发生异常,它被抛出。程序代码可以捕捉这个异常(用catch)并且用某种合理的方法处理该异常。系统产生的异常在Java运行时被系统自动引发。手动引发一个异常,用关键字throw。任何被引发方法的异常都必须通过throws子句定义。任何在方法返回前绝对被执行的代码都被放置在finally块中。下面是一个异常处理的通常形式:try / block of code to monitor for errors catch(ExceptionType1 ex0b) /exception handler for ExceptionType1catch(ExceptionType2 ex0b) /exception handler for ExceptionType2/finally /block of code to be executed before try block ends这里,ExceptionType 是发生异常的类型。声明抛出异常:在Java中程序可以用throw语句引发明确的异常。Throw语句的通常形式为:“throw ThrowableInstance;”。在方法中声明异常:在throws子句中,可以声明方法中可能出现的异常从而告诉编译器它可能会产生哪些异常,从而要求用户必须考虑对这些异常的处理。一旦异常被抛出,程序控制由try块转到catch块。执行永远不会从catch块“返回”到try块。一旦执行了try和它的catch语句,程序控制从整个try/catch机制的下面一行继续。不能单独使用try,catch子句的目的是解决异常情况并且像错误没有发生一样继续运行。无论在try块中是否产生异常,也不管产生的异常是否会被捕获,finally中的语句最终会被执行。另外要指出一点的是,finally子句是可选的,可以有也可以无。每一个try语句至少需要一个catch或finally子句。4、 Java异常使用中的错误模式4.1 异常淹没程序捕获了一个异常, 但在后面并没有对这个异常进行处理或处理不当, 使得异常信息难以捕捉甚至消失, 从而造成异常信息淹没。4.1.1 忽略异常捕获了一个异常,但是在catch块中没有代码,对异常不作任何处理,忽略异常处理会使程序泄露意想不到的状态信息。故障模式举例如下:try FileInputStream is = new FileInputStream(name) ; catch(FileNotFoundException e) 4.1.2 消失的异常Java支持try/finally语法。不论异常是否抛出,finally模块总是在try模块后执行。但是如果finally模块包含一个return语句,则会抑制异常的抛出,造成异常丢失。故障模式举例如下:try throw new MagicException() ;finally if (returnFromFinally) return; 4.1.3 不使用具体的异常极度通用的trycatch块是另一种形式的异常淹没,在方法中不是抛出适当的异常,而是普通的Exception或者Throwable。由于绝大多数异常都直接或间接从java.lang.Exception派生,catch (Exception ex)就相当于说我们想要处理几乎所有的异常。普通的异常使调用者不知道具体发生了什么异常, 增加了恰当处理问题的难度。故障模式举例如下:try catch (Exception ex) ex.printStackTrace() ;4.2异常使用不当程序中捕获所有异常是一个好想法,但在程序中太广泛地捕获异常或对其使用不正确则会影响程序的执行效率甚至威胁程序的安全。4.2.1 程序捕获了非检查类异常使用程序捕获NullPointerException、OutMemoryError等非检查异常。故障模式举例如下:try mysteryMethod() ;catch (NullPointerException npe) 4.2.2 异常的产生导致锁无法释放程序中unlock的位置不恰当。程序在try内部发生异常,以致unlock()将无法调用,上了锁之后不释放引起死锁。正确的处理是在finally中显式释放。故障模式举例如下:void action() Lock l = new ReentrantLock();l.lock();trydosomething();catch(java.lang.Exception e)throw new RuntimeException(xxx);l.unlock();4.3 在控制流中使用异常只为异常条件使用异常。异常只是用在异常条件下,不能用于正常的控制流。将异常用于控制流会降低代码的可维护性和可读性。故障模式举例如下:tryIterator i = collection.iterator();while(true)Foo foo = (Foo)i.next();catch(NoSuchElementException e)正确的使用异常处理机制能增强系统的健壮性,而带有错误的异常处理代码不但不能增加程序的健壮性,反而会影响到系统的安全。为了充分发挥异常处理机制的作用,得到高效的Java程序,应该避免使用各种Java异常故障模式,按照正确的方法设计使用异常处理机制,使其更好地为Java 程序服务。5、 结语针对程序中出现的异常问题,以异常的方式进行处理,不仅可以提高程序运行的稳定性、程序的可行性,然而应该注意,由于异常处理需要初始化新的异常对象,需要重新返回调用堆栈并向调用方法传递异常,所以通常情况下,异常处理需要更多的时间和资源。异常处理不应该代替简单的测试和判断。如果可能的话,应该用判断语句测试简单的异常,而用异常处理去处理那些if语句不能解决的情况。不要使用异常处理进行输入有效性检查,可以使用简单的if语句来判断。参考文献:1杨洪路,高文龄,宫云战,白哥乐Java异常故障模式分析、信息化纵横2009年第9期2张曜,张青,郭立山Java程序设计教程冶金工业出版社,2002年12月3(美)Y.Daniel Liang著,王镁,李娜译Java语言程序设计机械工业出版社,2004年4月4王萌,刘婧,来宾 Java程序设计冶金工业出版社,2006年3月5(美)Herbert Schildt著,张玉清,吴浦峰,尚勇译Java2参考大全第四版清华大学出版社2002年1月6飞思科技产品研发中心编著Java2应用开发指南电子工业出版社2002年1月7闻丽华,Java异常处理机制及应用,软件导刊2009年5月第8卷第5期
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号