1、异常分类 a)按照java本身的设计,有三种可抛出的结构,即checked exception, runtime exception, error,注意这里只是一些分类名称,不代表类名称。 b)其中checked exception和runtime exception(unchecked exception)是由于程序本身的设计或者实现问题引发的,是一种异常,所有的异常都是Exception的子类。而error是由于系统资源不足、约束失败或者JVM的运行环境出现故障导致的,一旦发生,系统将不能恢复,所以它不是一种异常,这里不作讨论。 c)所有的Exception和Error都继承自Throwable类,都需要是可抛出的、可记录的,下面是一个简单的UML示意图(没有全部画出) 其中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 — [...]
java中异常小结
最新推荐文章于 2022-01-05 16:57:38 发布