浅析Java 语言中两种异常
陈富节 吉林 文佳 谢声时 陈小辉
(中国人民银行海口中心支行海口 570105)
摘要:Java作为一种纯面向对象的程序语言,程序运行过程中的异常也被作为一种对象来对待。Java程序提供的两种异常在机制和逻辑上都各不相同。本文通过几个小实例,分别从这两个方面来阐述java两类异常的差异性。
关键词:面向对象java 异常 差异性
中图分类号:TP311 文献标识码:A 文章编号:1672-3791(2009)12(c)-0013-01
程序员能够正确处理好开发语言的异常,是开发出高质量应用代码的前提。Java提供了两类主要的异常:Runtime Exception和Checked Exception。所有的Checked Exception是从java.lang.Exception类衍生出来的,而Runtime Exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。这两种异常在机制上和逻辑上都存在差异性,下文就这两者的差异性做详细阐述。
1 机制上的差异性R u n t ime E x c e p t i o n 和Ch e c k e dException,两者在机制上的不同表现在两点:1、如何定义方法;2、如何处理抛出的异常。以下为CheckedException的定义:public class CheckedException extendsException{ public CheckedException() {} public CheckedException( Stringmessage ) {super( message ); }}以下为一个使用Exception的例子:public class ExceptionalClass{ public void method1() throws CheckedException { / / . . . t h r o w n e wCheckedException( "...出错了" ); } public void method2( String arg ) { if( arg == null ) {throw new Nul lPointerExcept ion("method2的参数arg是null!" ); } } publ i c void method3( ) throwsCheckedException {method1( ) ; }}以上实例中的两个方法method1()和method2()都会抛出exception,可是只有method1()做了声明。另外,method3()本身并不会抛出exception,可是它却声明会抛出CheckedExcept ion。public static void main( String[] args ){ ExceptionalClass example = newExceptionalClass(); try { example.method1(); example.method3(); } catch( CheckedException ex ) { }example.method2( null );}在这个类的在main()方法中,如果要调用method1(),你必须把这个调用放在try/catch程序块当中,因为它会抛出Ch e c k e dexc ept ion。相比之下,当你调用method2()时,则不需要把它放在try/catch程序块当中,因为它会抛出的exception不是checked exception,而是runtime exception。会抛出runtime exception的方法在定义时不必声明它会抛出exception。在method3()中,它调用了method1()却没有把这个调用放在try/catch程序块当中。它是通过声明它会抛出method1()会抛出的exception来避免这样做的。它没有捕获这个exception,而是把它传递下去。实际上main()方法也可以这样做,通过声明它会抛出Checkedexception来避免使用try/catch程序块。( 1)、异常Runtime exceptions:在定义方法时不需要声明会抛出r u n t imeexception;在调用这个方法时不需要捕获这个runt ime except ion;它是从java. lang.RuntimeException或java.lang.Error类衍生出来的。( 2)、异常Checked Exceptions:在定义方法时必须声明所有可能会抛出的checkedexception;在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去;它是从java.lang.Exception类衍生出来的。
2 逻辑上的差异性从逻辑的角度来说,checked exceptions和runtime exception是有不同的使用目的的。checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。checked exception迫使你捕获它并处理这种异常情况。以java.net.URL类的构建器(constructor)为例,它的每一个构建器都会抛出MalformedURLExcept ion。MalformedURLException就是一种checked exception。下面举两个实际应用中的小例子。一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。如果用户输入的URL有错误,构建器就会抛出一个exception。既然这个exception是checked exception,你的程序就可以捕获它并正确处理:比如说提示用户重新输入。再看下面这个例子:public void method(){ int [] numbers = { 1, 2, 3 };int sum = numbers[0] + numbers[3];}在运行方法me t h o d ( ) 时会遇到ArrayIndexOutOfBoundsException(因为数组numbers的成员是从0到2)。对于这个异常,调用方无法处理/纠正。这个方法method()和上面的method2()一样,都是runtime exception的情形。上面我已经提到,runtime exception用来指示一种调用方本身无法处理/恢复的程序错误。而程序错误通常是无法在运行过程中处理的,必须改正程序代码。
3 结 语
通过上面的分析举例可以看出Java的两种异常,在机制上和逻辑上都存在很大的差异性。在程序的运行过程中一个checked exception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。而对于runtime exception,则不应当在程序中捕获它。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。所以在程序的开发测试过程中,要正确处理好何时捕获、如何捕获并利用这两种异常来为开发测试服务的问题,才能开发出高质量、高效的应用程序。
1、最快当天审稿 最快30天出刊
易品期刊网合作杂志社多达400家,独家内部绿色通道帮您快速发表(部分刊物可加急)! 合作期刊列表
2、100%推荐正刊 职称评审保证可用
易品期刊网所推荐刊物均为正刊,绝不推荐假刊、增刊、副刊。刊物可用于职称评审! 如何鉴别真伪期刊?
都是国家承认、正规、合法、双刊号期刊,中国期刊网:http://www.cnki.net 可查询,并全文收录。
3、八年超过1万成功案例
易品期刊网站专业从事论文发表服务8年,超过1万的成功案例! 更多成功案例
4、发表不成功100%全额退款保证
易品期刊网的成功录用率在业内一直遥遥领先,对于核心期刊的审稿严格,若未能发表,全额退款! 查看退款证明