异常处理机制——声明异常

异常处理机制除了捕获处理外,还有另一种处理方法——声明异常。

声明异常处理方式,其实就是“不处理”的方式。不去处理异常,只是告诉调用者可能会出现哪些异常,让调用者自己去处理。

在实际开发中,这种“不处理”比捕获用的更多。

声明检查型异常

方法不仅需要告诉编译器将要返回什么值,还要告诉编译器可能出现的错误。下面来看如何声明一个异常:

public static Class TestException (String name) throws ClassNotFoundException
{
    return Class.forName(name);
}

如果参数name是不存在的类名,那么 Class.forName(name)将会抛出ClassNotFoundException异常。方法体内可能检查型抛出异常,如果未对其进行捕获,就必须在方法声明的时throw这个异常。

如果一个方法可能抛出多个检查型异常,那么就必须在方法的首部中列出所有可能的异常类,每个异常类之间用,隔开。

public void Test () throws EA,EB,EC
{
    ......
}

但是,不需要声明java的内部错误,即从Error继承的异常。任何程序代码都有可能抛出那些异常,我们对此完全无法控制。

同样,也不应该声明从RuntimeException继承的那些非检查型异常。这些运行错误完全在我们的控制之中。应该多花时间修正这些错误,而不是声明这些错误有可能发生。

总结:一个方法必须声明所有可能抛出的检查型异常,而非检查型异常要么在你的控制之外(Error),要么是从一开始就应该避免的情况导致的(RuntimeException)。如果你的方法没有声明所有可能发生的检查型异常,编译器就会发出一个错误信息。

如果在子类中覆盖了超类的一个方法,子类方法中声明的检查型异常不能比超类方法中声明的异常更通用(子类方法可以抛出更特定的异常或者根不不抛出任何异常)特别需要注意的是,如果超类方法没有抛出异常,子类也不能抛出异常。

如果类中的一个方法声明它会抛出一个异常,而这个异常是某个特定类的实现,那么这个方法抛出的异常可能属于这个类,也可能属于这个类的任意一个子类。