如果一个用户在程序运行期间,由于程序的错误或者一些外部环境的影响造成数据丢失,用户可能就不会在用这个程序了,为了避免此类事情的发生。Java使用一种称为异常处理的错误捕捉机制处理。
一、 异常的分类
Java中异常对象都是派生于Throwable类的一个实例。同时用户还可以创建自己的异类。
Throwable类下面有两大继承类,分别是Error和Exception。
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。最需要关心的是Exception层次结构。这个程序又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由于程序错误导致的异常属于RuntimeException;而程序本身没有问题。
Java中语言规范将派生于Error类或者RuntimeException类的所有异常称为未检查异常,所有其他的异常称为已检查异常。
派生于RuntimeException的异常包括如下:
1、 错误的类型的类型转换。
2、 数组访问越界。
3、 访问空指针。
不是派生于RuntimeException的异常包括
1、 试图在文件尾部后面读取数据。
2、 试图打开一个错误格式的URL。
二、声明已检查异常
方法应该在其首部声明所有可能抛出的异常。这样可以从其首部反映出这个方法可能抛出哪些已检查异常。
public void div(int a,int b) throws ArithmeticException
在自己编写方法时,不必将所有可能的异常进行抛出,至于什么时候抛出,有以下集中情况:
1. 调用一个抛出已检查异常的方法。
2. 程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常。
3. 程序出现错误,例如,a[-1]=0抛出一个ArrayIndexOutOfBoundsException这样的未检查异常。
4. Java虚拟机和运行时库出现的内部异常。
如果出现前两种情况之一,则必须告诉调用这个方法的程序员有可能抛出异常。
对于那些可能被他人只用的Java方法,应该根据异常规范,在方法的首部声明这个方法可能抛出的异常。
class ExceptionDemo
{
public Image loadImage(String s) throws IOException
{}
}
如果一个方法有可能抛出多个已检查异常,那么就必须在方法的首部列出所有的异常类。每个异常类用逗号隔开。
class ExceptionDemo
{
public Image loadImage(String s) throws IOException,MalformedURLEcception
{}
}
但是,不需要声明Java的内部错误,即从Error继承的错误。任何代码受具有抛出那些异常的可能,而我们对其没有任何控制能力。
同样,也不应该声明从RuntimeException继承的那些未检查异常。
class ExceptionA
{
public void div(int a,int b) throws ArithmeticException
{}
}
这些运行错误完全在我们的控制之下。如果特别关注数组下标引发的错误,就应该更多的时间话费在修正程序错误上,而不是说明这些错误发生的可能性上。
总之,一个方法必须声明所有可能的抛出的已检查异常。而未检查异常要么不可控制,
要么就应该避免发生。如果方法没有声明所有可能发生的已检查异常,编译器就会给一个错误消息。