25.JAVA编程思想——标准Java违例

25.JAVA编程思想——标准Java违例

Java 包含了一个名为Throwable的类,它对可以作为违例“掷”出的所有东西进行了描述。Throwable 对象有两种常规类型(亦即“从Throwable 继承”)。其中,Error 代表编译期和系统错误,我们一般不必特意捕获它们(除在特殊情况以外)。Exception 是可以从任何标准Java 库的类方法中“掷”出的基本类型。此外,它们亦可从我们自己的方法以及运行期偶发事件中“掷”出。为获得违例的一个综合概念,最好的方法是阅读由http://java.sun.com 提供的联机Java 文档(首先下载它们更好)。为了对各种违例有一个大概的印象,这个工作是相当有价值的。但大家不久就会发现,除名字外,一个违例和下一个违例之间并不存在任何特殊的地方。此外,Java 提供的违例数量正在日益增多;从本质上说,把它们印到一本书里是没有意义的。大家从其他地方获得的任何新库可能也提供了它们自己的违例。我们最需要掌握的是基本概念,以及用这些违例能够做什么。

java.lang.Exception

这是程序能捕获的基本违例。其他违例都是从它衍生出去的。这里要注意的是违例的名字代表发生的问题,而且违例名通常都是精心挑选的,可以很清楚地说明到底发生了什么事情。违例并不全是在java.lang 中定义的;有些是为了提供对其他库的支持,如util,net 以及io 等——我们可以从它们的完整类名中看出这一点,或者观察它们从什么继承。例如,所有IO 违例都是从java.io.IOException 继承的。

1   RuntimeException的特殊情况

if(t == null)

throw newNullPointerException();

看起来似乎在传递进入一个方法的每个句柄中都必须检查null(因为不知道调用者是否已传递了一个有效的句柄),这无疑是相当可怕的。但幸运的是,我们根本不必这样做——它属于Java 进行的标准运行期检查的一部分。若对一个空句柄发出了调用,Java 会自动产生一个NullPointerException 违例。所以上述代码在任何情况下都是多余的。

这个类别里含有一系列违例类型。它们全部由Java 自动生成,毋需我们亲自动手把它们包含到自己的违例规范里。最方便的是,通过将它们置入单独一个名为RuntimeException 的基础类下面,它们全部组合到一起。这是一个很好的继承例子:它建立了一系列具有某种共通性的类型,都具有某些共通的特征与行为。此外,没必要专门写一个违例规范,指出一个方法可能会“掷”出一个RuntimeException,因为已经假定可能出现那种情况。由于它们用于指出编程中的错误,所以几乎永远不必专门捕获一个“运行期违例”——RuntimeException——它在默认情况下会自动得到处理。若必须检查RuntimeException,我们的代码就会变得相当繁复。在我们自己的包里,可选择“掷”出一部分RuntimeException。如果不捕获这些违例,又会出现什么情况呢?由于编译器并不强制违例规范捕获它们,所以假如不捕获的话,一个RuntimeException 可能过滤掉我们到达main()方法的所有途径。

2     代码

public class NeverCaught {

    static voidf() {

        throw new RuntimeException("From f()");

    }

    static voidg() {

        f();

    }

    public staticvoidmain(String[] args){

        g();

    }

} /// :~

3     执行如下

Exceptionin thread "main" java.lang.RuntimeException: From f()

    at NeverCaught.f(NeverCaught.java:3)

    at NeverCaught.g(NeverCaught.java:7)

    at NeverCaught.main(NeverCaught.java:11)

一个RuntimeException(或者从它继承的任何东西)属于一种特殊情况,因为编译器不要求

为这些类型指定违例规范。

假若一个RuntimeException 获得到达main()的所有途径,同时不被捕获,那么当程序退出时,会为那个违例调用printStackTrace()。注意也许能在自己的代码中仅忽略RuntimeException,因为编译器已正确实行了其他所有控制。因为RuntimeException在此时代表一个编程错误:

(1) 一个我们不能捕获的错误(例如,由客户程序员接收传递给自己方法的一个空句柄)。

(2) 作为一名程序员,一个应在自己的代码中检查的错误(如ArrayIndexOutOfBoundException,此时应注意数组的大小)。

可以看出,最好的做法是在这种情况下违例,因为它们有助于程序的调试。

另外一个有趣的地方是,我们不可将Java 违例划分为单一用途的工具。的确,它们设计用于控制那些讨厌的运行期错误——由代码控制范围之外的其他力量产生。但是,它也特别有助于调试某些特殊类型的编程错误,那些是编译器侦测不到的。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值