`

java异常总结(转)

 
阅读更多

java中异常小结  

2010-07-03 10:49:47|  分类: 实践 |  标签:exception  异常  java  |字号 订阅

 
 

<wp:post_date>2008-11-10 13:35:48</wp:post_date>

1、异常分类

a)按照java本身的设计,有三种可抛出的结构,即checked exception, runtime exception, error,注意这里只是一些分类名称,不代表类名称。

b)其中checked exception和runtime exception(unchecked exception)是由于程序本身的设计或者实现问题引发的,是一种异常,所有的异常都是Exception的子类。而error是由于系统资源不足、约束失败或者JVM的运行环境出现故障导致的,一旦发生,系统将不能恢复,所以它不是一种异常,这里不作讨论。

c)所有的Exception和Error都继承自Throwable类,都需要是可抛出的、可记录的,下面是一个简单的UML示意图(没有全部画出)

java中异常小结 - colorfree - cee free

 
其中RuntimeException及其子类(这里没有画出)都是属于unchecked exception,运行时由JVM抛出不需要开发人员捕获、处理。其他的Exception及其子类都属于checked exception,这些异常往往是由开发人员自己实现的,明确借助关键字throws显式抛出、try…catch模块捕获处理的。

2、异常的使用和处理

a)未被检测的异常(unchecked exception),不需要开发人员管理,这种运行的异常会有JVM自行抛出;也不需要开发人员捕获处理。因为unchecked exception往往是在不可恢复的情形下抛出的,继续执行下去没有必要,而且JVM会自动的停止线程的执行,给出一个适当的异常信息。

b)被检测的异常(checked exception),需要开发人员明确使用throws抛出、try…catch模块捕获处理的。这里会有几种情况需要注意一下。

i.一般情况下:catch语句中做相应的处理,如打日志等等。
ii.异常转译:如果高层的实现应该捕获低层的异常,那么低层就应该抛出一个高层可以解释的异常,举个AbstractSequetialList(是List的骨架实现)的例子,代码如下
//return the element at the specified position in the list
public Object get( int index ){
ListIterator i = ListIterator( index );
try{
   return i.next();
}catch( NoSuchElementException e ){
   throw new IndexOutOfBoundsException( “index” + index );
}
}

iii.异常链接:底层的异常被高层异常保存起来,并且高层异常提供一个公有的访问接口来获得该底层异常,这样对调试更加有利。Jdk1.4可以如下实现
HigherLevelException( Throwable t ){
super(t);
}

c)慎用checked exception,如果抛出的被检测异常是唯一的,比如说CloneNotSupportedException这是只有实现了Cloneable接口的类才有的异常。可以想象如果所有异常你都抛出的话,对于API的调用者来说处理这些异常的try…catch模块是多么大,维护成本是多么高!所以这时候就需要把某些checked exception以unchecked exception的形式抛出,只要地方合适。

3、几种常见的异常及其含义
IllegalArgumentException 参数的值不合适
IllegalStateException 对于这个方法,对象的状态不合适
NullPointerException 在Null被禁止的情况下使用Null值对象或者引用
IndexOutOfBoundsException 下标越界
ConcurrentModificationException 禁止并发修改的时,对象检测到并发修改
UnsupportedOperationException 对象不支持客户请求

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics