java核心技术卷 之异常分类

        在Java程序设计语言中,异常对象都是派生于Throwable类的一个实例。稍后还可以看到,如果Java中内置的异常类不能够满足需求,用户可以创建自己的异常类。
        图是Java异常层次结构的一个简化示意图。
需要注意的是,所苻的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error 和 Exception
         Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了。这种情况很少出现。 
        在设计Java程序时,需要关注Exception层次结构。这个层次结构又分解为两个分支: 一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。
         派生于RuntimeException的异常包含下面几种情况: 
错误的类型转换。 
数组访问越界。
访问空指针
不是派生于RuntimeException的异常包括: 
试图在文件尾部后面读取数据u
试图打开一个不存在的文件。
试图根据给定的字符串杳找Class对象,而这个字符串表示的类并不存在。
         应该通过检测数组下标是否越界来避免ArrayIndexOutOfBoundsException异常;应该通过在使用变量之前检测是否为空来杜绝NullPointerException异常的发生。
         如何处理错误格式的URL呢?在使用URL之前,是否也需要尽可能地判断是否“具有错误格式”呢?事实上,不同的浏览器可以处理不同类别的URU例如,Netscape可以处理 mailto:URL格式,而applet查看器就不能处理这种格式。因此“具存错误格式”取决于具体的环境,而不仅仅是程序代码。 Java 言规范将派生于Error类或RuntimeException类的所有异常称为未检查 (unchecked)异常,所有其他的异常称为已检查(checked)异常。这是两个很有用的术语。编译器将核查是否为所有的已检查异常提供了异常处理器。
声明已检查异常
         在自己编写方法时,不必将所有能拋出的异常都进行声明。至于什么时候需要在方法中用throws子句声明异常,什么异常必须使用throws子句声明,需要记住在遇到下面4种情况时应该抛出异常:
1 )调用一个抛出已检査异常的方法,例如,FildninuStreani构造器。
2)程序运行过程中发现错误,并利用throw语句拋出一个已检杏异常。 
3)程序出现错误,例如,a[-l]=0会抛出一个ArraylndexOutOfBoundsException这样的未检查异常。
4 ) Java虚拟机和运行时库出现的内部错误。
         如果出现前两种情况之一,则必须告诉调用这个方法的程序员有可能拋出异常。因为任何一个拋出异常的方法都有可能是一个死已陷阱。如果没冇处理器捕获这个异常,当前执行的线程就会结束。
         对于那些可能被他人使用的Java方法,应该根据异常规范( exception specification),在方法的首部声明这个方法可能抛出的异常。
class MyAnimation
....
public Image loadIraage(String s) throws IOException
{
....
}
}
         如果一个方法有可能抛出多个已检杳异常,那么就必须在方法的首部列出所能的异常类。每个异常类之间用逗号隔开。如下面这个例子所示: 
class MyAnimation 
....
public Image loadIraage(String s) throws IOException,EOFException
{
....
}
}
        但是,不需要声明Java的内部错误,即从EITOIR继承的错误。任何程序代码都具有抛出那些异常的潜能,而我们对其没有任何控制能力。 同样,也不应该声明从RuntimeException继承的那些未检查异常。

猜你喜欢

转载自blog.csdn.net/u014572215/article/details/78203753
今日推荐