Java语言的异常处理机制研究

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Java语言的异常处理机制研究摘要异常是用来处理程序错误的有效机制。本文通过对Java语言异常处理机制的分析,结合实例,对这一处理程序错误的有效方式和设计原则进行了探讨。关键词Java;异常;异常处理机制1引言程序执行时经常会出现除零溢出、数组越界等运行错误,影响程序的正常执行。错误及异常是不可避免的,一个好的应用程序,在满足用户要求的各种功能的同时,还应具备能预见程序执行过程中可能产生的各种异常的能力,并能为异常情况给予恰当处理。在Java语言中,这种技术就是异常处理(ExceptionHandling)。Java语言通过面向对象的异常处理机制来解决运行期间的错误,可以预防错误的程序代码或系统错误所造成的不可预期的结果发生。减少编程人员的工作,增加了程序的灵活性,增加程序的可读性和健壮性[1]。本文结合实例,对Java语言中的异常处理机制及异常设计原则进行了探讨。2Java的异常处理机制Java通过面向对象的方法来处理异常。把各种异常进行分类,并提供了良好的接口。在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常的一个对象,并把它交给运行时系统。运行时系统寻找相应的代码来处理这一异常。2.1Java中的异常类面向对象的Java语言把异常封装到类里。Java异常类层次结构如图1所示。Java异常是对象或类的实例,所有异常类的基类是Throwable类。Java将异常分为Error和Exception两大类。Error类描述了Java运行系统中的内部错误、死循环或内存溢出等类似情况,称之为致命性错误。只能在编程阶段解决,运行时程序本身无法解决。只能靠其它程序干预,所以应用程序不应该抛出这类异常[2]。程序设计中关注的是Exception类。它有三个子类,RuntimeException、IOException和其它异常子类,包括用户自定义异常。图1Java异常类层次结构RuntimeException类型的异常是由编程导致的错误,和Error一样,如果在程序运行时产生,只能找出程序中的错误加以修改。Exception的其它子类必须在程序中进行处理,否则不能通过编译。本文研究的正是这类异常。2.2Java异常处理方法Java程序设计中,采用try……catch……finally语句结构和主动抛出异常语句throw等方法来实现。通过try……catch……finally语句可以捕获一个或多个异常,其基本格式是:try{语句体}catch(异常错误类型变量名){语句体}finally{语句体}上面语句中的异常对象是在Java运行时由系统抛出的。还可以使用throw语句明确抛出一个异常,其基本格式是:throw异常对象2.2.1创建和捕获异常对异常进行处理时,将引起异常的语句添加到最近的try语句中,由catch进行识别和处理。如果异常发生时能确保有一段代码被执行,则应该使用finally子句。请参看例1。例1classMyEx01{publicintdivide(intx,inty){returnx/y;}}classExTest01{publicstaticvoidmain(String[]args){try{intresult=newMyEx01().divide(3,0);System.out.println(result=+result);}catch(Exceptione){System.out.println(发生异常,异常类型为:+e.getMessage());}finally{System.out.println(“finally语句被执行”);}}例1主动产生一个被0除的异常,然后用catch语句捕获。被0除异常是一种ArithmeticException类的异常,通过getMessage()方法显示出具体类型,而finally语句最终也被执行。2.2.2自定义异常及抛出异常在Java编程的过程中,可以抛出类库中的异常或自定义的异常。Java程序在运行时如果引发了一个可识别的错误,就会产生一个与该错误相对应的异常,这个过程被称为异常的抛出。根据异常类的不同,抛出异常的方法也不同。1)系统自动抛出的异常所有的系统定义的运行异常都是由系统自动抛出。如例1,由于错误地以0为除数,运行过程中将引发ArithmeticException;这个异常类是系统预先定义好的类,对应于系统可识别的错误,所以Java虚拟机遇到这种错误就会自动中止程序的流程,并新建一个ArithmeticException类的异常,即抛出一个算术运算异常。此程序没有编译错误,但存在运行错误,由于没有接收异常和处理异常的语句,所以程序在运行时给出如此信息。2)语句抛出的异常用户程序自定义的异常不可能依靠系统自动抛出,而必须借助于throw语句来定义何种情况下产生了这种错误对应的异常,并及时抛出这个异常类的新对象。请参看例2。例2classMyEx02extendsException{publicMyEx02(){super(字符串太短);}publicvoidsomeMethod(Strings)throwsMyEx02{if(s.length()=3){thrownewMyEx02();}else{System.out.println(字符串长度符合规定);}}}classExTest02{publicstaticvoidmain(String[]args){try{MyExmy=newMyEx02();my.someMethod(abcedef);my.someMethod(ab);}catch(MyEx02e){System.out.println(e.getMessage());}}}例2这种抛出异常的语句应该被定义在满足一定条件时执行,所以通常把throw语句放在if语句中,即用户定义的逻辑错误发生时才执行。2.2.3隐瞒异常,或改报其他异常在方法调用过程中有时为了安全保密,内部人员按照一定的约定,然后通过throw语句根据相应情况,灵活主动地抛出异常,可以隐瞒异常,或改报其他异常,请参看例3。例3classMyEx03{publicvoidtestL(Strings)throwsException{try{inti=s.length();}catch(NullPointerExceptione){thrownewArraylndexOutOfBoundsException(越界);}}publicstaticvoidmain(String[]args){MyEx03exTest=newMyEx03();Strings=null;try{exTest.testL(s);}catch(Exceptione){e.printStackTrace();}}}3异常处理的设计原则3.1定义分层次的异常一般来说,不同的异常需通过定义不同的类来实现,且在产生异常实例中需要用不同的初始化参数。一个好的异常设计需要定义一系列可能的异常树。异常是多种多样的,我们应该尽可能地捕捉到所有的异常,但是将try块的范围扩大并不是一个好的解决方案,相反地,我们应该尽可能地缩小try块的范围,使异常处理与方法的主要逻辑分离,这将有利于代码的调试和维护。3.2合理地运用异常父类运用异常的基类可以捕获一类异常,可以使程序简捷一些,而且很多时候我们也的确不需要对捕捉的异常类型做特殊的处理,但是也并不是鼓励全都使用父类,比如Exception可以捕捉所有的异常,但如果全都使用Exception的话,对调试和代码维护都是极为不利的。3.3每个独立的线程要捕获所有异常和错误线程一旦启动,就相当于一个主程序。它的840方法中如果出现异常或错误,将不会有其它主程序来捕获它。一般在写程序时,会捕获线程中的异常,不捕获将通不过编译,但要记住同时需捕获Error或RuntimeException,否则如果一个线程运行中出现这样的问题,很有可能程序会无声无息地死去。所以一个线程的840方法中最好要有一个包含整个方法的try……catch块[3]。4结束语计算机语言的演变允许开发人员处理失败,Java对异常处理程序的支持简化了这一任务[4]。本文通过实例分析了Java语言中的异常处理机制,对于采用面向对象的方法进行异常处理,合理优化程序设计,提高系统安全性和稳定性的机制作了初探。参考文献[1]张白一,崔尚森.面向对象程序设计-Java[M].西安:西安电子科技大学出版社,2003:249-258[2]绍丽萍,绍光亚.Java语言程序设计[M].北京:清华大学出版社,2004:114-126[3]刘小兵,巨亚荣.Java异常处理与编程方法[J].后勤工程学院学报,2005(3):102-104[4]JeffFriesen.用实例学Java2[M].钟萍,张玉峰等译.北京:电子工业出版社,2002:269-290

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功