),它的作用是返回一个对象, 用它代表这个对象的类。我们可依次用 getName()或 toString()
查询这个 Class 类的名字。亦 可对 Class 对象进行一些复杂的操作,尽管那些操作在违例控制中是不必要的。本章稍后还 会详细讲述 Class 对象。 下面是一个特殊的例子,它展示了 Exception 方法的使用(若执行该程序遇到困难,请 参考第 3 章 3.1.2 小节“赋值”) : //: ExceptionMethods.Java // Demonstrating the Exception Methods package c09; public class ExceptionMethods { public static void main(String[] args) { try { throw new Exception("Here's my Exception"); } catch(Exception e) { System.out.println("Caught Exception"); System.out.println( "e.getMessage(): " + e.getMessage()); System.out.println( "e.toString(): " + e.toString()); System.out.println("e.printStackTrace():"); e.printStackTrace(); } } } ///:~ 该
程序输出如下: Caught Exception e.getMessage(): Here's my Exception e.toString(): java.lang.Exception: Here's my Exception e.printStackTrace(): java.lang.Exception: Here's my Exception
at ExceptionMethods.main 可以看到,该方法连续提供了大量信息——每类信息都是前一类信息的一个子集。 本章的第一个例子是: if(t == null) throw new NullPointerException(); 看起来似乎在传递进入一个方法的每个句柄中都必须检查 null 因为不知道调用者是否 ( 已传递了一个有效的句柄) ,这无疑是相当可怕的。但幸运的是,我们根本不必这样做—— 它属于 Java 进行的标准运行期检查的一部分。若对一个空句柄发出了调用,Java 会自动产 生一个 NullPointerException 违例。所以上述代码在任何情况下都是多余的。 这个类别里含有一系列违例类型。它们全部由
Java 自动生成,毋需我们亲自动手把它 们包含到自己的违例规范里。最方便的是,通过将它们置入单独一个名为 RuntimeException 的基础类下面,它们全部组合到一起。这是一个很好的继承例子:它建立了一系
列具有某种 共通性的类型,都具有某些共通的特征与行为。此外,我们没必要专门写一个违例规范,指 出一个方法可能会“掷”出一个 RuntimeException,因为已经假定可能出现那种情况。由于它 们用于指出编程中的错误,所以几乎永远不必专门捕获一个“运行期违 例 ”——RuntimeException—— 它 在 默 认 情 况 下 会 自 动 得 到 处 理 。 若 必 须 检 查 RuntimeException,我们的代码就会变得相当繁复。在我们自己的包里,可选择“掷”出一部 分 RuntimeException。 如果不捕获这些违例,又会出现什么情况呢?由于编译器并不强制违例规范捕获它们, 所以假如不捕获的话,一个 RuntimeException 可能过滤掉我们到达 main()方法的所有途径。 为体会此时发生的事情,请试试下面这个例子: //: NeverCaught.java // Ignoring RuntimeExceptions public class NeverCaught { static void f() { throw new RuntimeException("From f()"); } static void g() { f(); } public static void main(String[] args) { g(); } } ///:~ 大家已经看到, 一个 RuntimeException (或者从它继承的任何东西) 属于一种特殊情况, 因为编译器不要求为这些类型指定违例规范。 输出如下: java.lang.RuntimeException: From f() at NeverCaught.f(NeverCaught.java:9) at NeverCaught.g(NeverCaught.java:12) at NeverCaught.main(NeverCaught.java:15) 所以答案就是: 假若一个 RuntimeException 获得到达 main()的所有途径, 同时不被捕获, 那么当程序退出时,会为那个违例调用 printStackTrace()。
注意也许能在自己的代码中仅忽略 RuntimeException,因为编译器已正确实行了其他所 有控制。因为 RuntimeException 在此时代表一个编程错误