运行期异常(RuntimeException)的特例

在本章的第一个例子中:


if(t == null)
throw new NullPointerException(); 


如果必须对传递给方法的每个引用都检查其是否为 null(因为你无法确定调用者是否传
入了非法引用),这听起来着实吓人。幸运的是,这不必由你亲自来做,它属于 Java
的标准运行期检测的一部分。如果在 null 引用上调用方法,Java 会自动抛出
NullPointerException 异常。所以上述代码是多余的。
 
属于运行期异常的类型有很多。它们会自动被 Java 虚拟机抛出,所以你不必在异常说
明中把它们列出来。这些异常都是从 RuntimeException 类继承而来,所以既体现了继
承的优点,使用起来也很方便。这构成了一组具有相同特征和行为的异常类型。并且,
你也不再需要在异常说明中声明方法将抛出 RuntimeException 类型的异常(或者任何
从 RuntimeException 继承的异常),它们也被称为“未被检查的异常”(unchecked
exception)。这种异常属于错误,将被自动捕获,就不用你亲自动手了。要是你自己
去检查 RuntimeException 的话,代码就显得太混乱了。不过尽管你通常不用捕获
RuntimeException 异常,但还是可以在代码中抛出 RuntimeException 类型的异常。
 
如果你不捕获这种类型的异常会发生什么事呢?因为编译器没有在这个问题上对异常说
明进行强制检查,RuntimeException 类型的异常也许会穿越所有的执行路径直达
main( )方法,而不会被捕获。要明白到底发生了什么,可以试试下面的例子:


//: c09:NeverCaught.java
// Ignoring RuntimeExceptions.
// {ThrowsException}
import com.bruceeckel.simpletest.*; 
public class NeverCaught { 
private static Test monitor = new Test(); 
static void f() {
throw new RuntimeException("From f()"); 
  }
static void g() {
    f();
  }
public static void main(String[] args) { 
    g();
    monitor.expect(new String[] { 
"Exception in thread \"main\" " +
"java.lang.RuntimeException: From f()",
"        at NeverCaught.f(NeverCaught.java:7)",
"        at NeverCaught.g(NeverCaught.java:10)",
"        at NeverCaught.main(NeverCaught.java:13)"
    });
  }
} ///:~


你能发现 RuntimeException(或任何从它继承的异常)是一个特例。对于这种异常类
型,编译器不需要异常说明。
 
所以答案是:如果 RuntimeException 没有被捕获而直达 main( ),那么在程序退出前
将调用异常的 printStackTrace( )方法。
 
请务必记住:你只能在代码中忽略 RuntimeException(及其子类)类型的异常,其它
类型异常的处理都是由编译器强制实施的。究其原因,RuntimeException 代表的是编
程错误:


1.你无法预料的错误。比如从你控制范围之外传递进来的 null 引用。
2.作为程序员,你应该在代码中进行检查的错误。(比如对于
ArrayIndexOutOfBoundsException,你就得注意一下数组的大小了。)在一个
地方发生的异常,常常会在另一个地方导致错误。


你会发现在这些情况下使用异常很有好处,它们能给调试带来便利。
 
值得注意的是:你不应把Java的异常处理机制当成是单一用途的工具。它确实是被设计
用来处理一些烦人的运行期错误,这些错误往往是由你的代码控制能力之外的因素导致

的,然而,它对于发现某些编译器无法检测到的编程错误,也是非常重要的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值