5.6 未检查异常

由于Java编程语言并不需要捕获方法或声明未检查异常(包括RuntimeException、Error及其子类),因此开发人员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException(运行时异常)。虽然这对于程序员来说似乎很方便,但是它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用你的类时产生问题。

运行时异常可能发生在程序中的任何地方,在典型的程序中它们可以非常多。例如,NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等都是非检查异常,在程序中可以选择捕获处理,也可以不处理。如果在每个方法声明中添加运行时异常就会降低程序的清晰度,因此编译器不需要捕获或声明运行时异常(尽管可以做到)。

通常的做法是当用户调用一个方法不正确时,抛出一个RuntimeException。例如,一个方法可以检查其中一个参数是否为null。如果参数为null,那么该方法可能会抛出NullPointerException异常,这是一个未检查异常。

一般来说,不要抛出一个RuntimeException或创建一个RuntimeException的子类,这样你就不会被声明哪些方法可以抛出什么异常所困扰了。

一个原则是:如果客户端可以合理地从期望异常中恢复,就使其成为一个已检查异常;如果客户端无法从异常中恢复,就将其设置为未检查异常。