ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### [特例:RuntimeException](https://lingcoder.gitee.io/onjava8/#/book/15-Exceptions?id=%e7%89%b9%e4%be%8b%ef%bc%9aruntimeexception) 在本章的第一个例子中: ~~~ if(t == null) throw new NullPointerException(); ~~~ 如果必须对传递给方法的每个引用都检查其是否为 null(因为无法确定调用者是否传入了非法引用),这听起来着实吓人。幸运的是,这不必由你亲自来做,它属于 Java 的标准运行时检测的一部分。如果对 null 引用进行调用,Java 会自动抛出 NullPointerException 异常,所以上述代码是多余的,尽管你也许想要执行其他的检查以确保 NullPointerException 不会出现。 属于运行时异常的类型有很多,它们被 java 自动抛出,所以不必在异常说明中把它们列出来。非常方便的是,通过将这些异常设置为`RuntimeException`的子类而把它们归类起来,这是继承的一个绝佳例子:建立具有相同特征和行为的一组类型。 RuntimeException 代表的是编程错误: 1. 无法预料的错误。比如从你控制范围之外传递进来的 null 引用。 2. 作为程序员,应该在代码中进行检查的错误。(比如对于 ArrayIndexOutOfBoundsException,就得注意一下数组的大小了。)在一个地方发生的异常,常常会在另一个地方导致错误。 在这些情况下使用异常很有好处,它们能给调试带来便利。 如果不捕获这种类型的异常会发生什么事呢?因为编译器没有在这个问题上对异常说明进行强制检查,RuntimeException 类型的异常也许会穿越所有的执行路径直达 main() 方法,而不会被捕获。要明白到底发生了什么,可以试试下面的例子: ~~~ // exceptions/NeverCaught.java // Ignoring RuntimeExceptions // {ThrowsException} public class NeverCaught { static void f() { throw new RuntimeException("From f()"); } static void g() { f(); } public static void main(String[] args) { g(); } } ~~~ 输出结果为: ~~~ ___[ Error Output ]___ 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 没有被捕获而直达 main(),那么在程序退出前将调用异常的 printStackTrace() 方法。 你会发现,RuntimeException(或任何从它继承的异常)是一个特例。对于这种异常类型,编译器不需要异常说明,其输出被报告给了 System.err。 请务必记住:代码中只有 RuntimeException(及其子类)类型的异常可以被忽略,因为编译器强制要求处理所有受检查类型的异常。 值得注意的是:不应把 Java 的异常处理机制当成是单一用途的工具。是的,它被设计用来处理一些烦人的运行时错误,这些错误往往是由代码控制能力之外的因素导致的;然而,它对于发现某些编译器无法检测到的编程错误,也是非常重要的。