快速业务通道

诊断Java代码: 连续初始化器错误模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

诊断Java代码: 连续初始化器错误模式

时间:2011-02-11 IBM Eric E. Allen

您经常会看到代码不是仅仅通过调用构造函数对类进行初始化,它还通过一些紧接着的意在设置各个域的动作对类进行初始化。不幸的是,这样紧接着的动作是错误的高发地带,会带来连续初始化(run-on initialization)类型的错误。

连续初始化

由于各种原因(多数是糟糕的),您经常会看到这样的类定义,其中的类构造函数并不带有足够的参数来适当地初始化类的所有域。这样的构造函数要求客户机类用几个步骤来对实例进行初始化(设置未被初始化的域的值),而不是用一个构造函数调用就行了。以这样的方式初始化实例是一个易于出错的过程,我把它称为 连续初始化。这个过程产生的各种错误类型有相似的症状和治疗方法,所以我们可以将它们统统归入一种称为 连续初始化器错误模式的模式。

例如,考虑以下代码:

清单 1. 一个简单的连续初始化

class RestrictedInt {   public Integer value;   public boolean canTakeZero;   public RestrictedInt(boolean _canTakeZero) {    canTakeZero = _canTakeZero;   }   public void setValue(int _value) throws CantTakeZeroException {    if (_value == 0) {     if (canTakeZero) {      value = new Integer(_value);     }     else {      throw new CantTakeZeroException(this);     }    }    else {     value = new Integer(_value);    }   } } class CantTakeZeroException extends Exception {   public RestrictedInt ri;   public CantTakeZeroException(RestrictedInt _ri) {    super("RestrictedInt can''t take zero");    ri = _ri;   } } class Client {   public static void initialize() throws CantTakeZeroException {    RestrictedInt ri = new RestrictedInt(false);    ri.setValue(0);   } }

诊断Java代码: 连续初始化器错误模式(2)

时间:2011-02-11 IBM Eric E. Allen

不幸的是,对这个类的实例的初始化序列很容易出错。您可能已经注意到,在上面的代码中,在第二个初始化步骤处抛出了一个异常。结果是,在执行该步骤后应该已经被设置了的域未被设置。

但是,所抛出的异常的处理程序可能并不知道该域未被设置。如果在从异常恢复的过程中,处理程序访问 RestrictedInt 的有问题的 value 域,那么连它自己都有可能在 NullPointerException 处受阻。

如果真发生了那样的事情,倒不如处理程序根本不存在来得好些。至少被检查的异常包含有一些关于它的起因的线索。但 NullPointerException 是臭名昭著的难以诊断的异常,因为它们(必然地)几乎不包含关于某个值为什么一开始被设置为空的信息。而且,这些异常仅在未被初始化的域被访问时才发生。那个访问很可能是在离该错误的起因(即一开始未能初始化该域)很远的地方发生的。

当然,连续初始化错误还会引起其它错误。

更多因连续而产生的错误

可能引起的其它错误是:

编写初始化代码的程序员可能会忘记把某个初始化步骤包括进去。

初始化步骤中可能存在程序员并不知道的基于次序的依赖关系,程序员因而会不按次序执行这些语句。

正在被初始化的类可能会被更改。新的域被添加进来,或者旧的域被删除。结果每个客户机中的所有初始化代码都必须修改,以适当地设置这些域。多数修改后的代码都很相似,但就算只漏了一个副本,也会带来错误。因此,连续初始化器很容易就会变成 rogue tile(请参阅我关于 Rogue Tile 错误模式的文章了解一些背景)。

由于所有问题都与连续初始化有关,所以,定义初始化所有域的构造函数会好得多。在上面的示

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号