快速业务通道

诊断Java代码: 悬挂复合错误类型 - 编程入门网

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

诊断Java代码: 悬挂复合错误类型

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

空指针到处都有!

在一个 Java 程序员所能遇到的所有异常中,空指针异常属于最恐怖的,这是因为:它是程序能给出的信息最少的异常。例如,不像一个类转型异常,空指针异常不给出它所需要的内容的任何信息,只有一个空指针。此外,它并不指出在代码的何处这个空指针被赋值。在许多空指针异常中,真正的错误出现在变量被赋为空值的地方。为了发现错误,我们必须通过控制流跟踪,以发现变量在哪里被赋值,并确定是否这么做是不正确的。当赋值出现在包中,而不是出现在发生报错的地方时,进程会被明显地破坏。

许多 Java 开发人员告诉我,他们所遇到的绝大多数程序崩溃是空指针异常,并且他们渴望有一种工具,能在程序第一次运行前静态地识别出这些错误。不幸的是,自动控制理论告诉我们,没有工具可以静态地决定哪些程序将抛出空指针异常。但是在一个程序中,用一个工具排除许多空指针异常是有可能的,留给我们仅仅一小部分需要我们必须人工检查的潜在的问题所在。实际上,为了为 Java 程序(请参阅 参考资料)提供这样一个工具,现在正做着一些研究。但是一个好的工具也只能为我们做这些。空指针异常将决不会被完全根除。当它们真的发生时,工具能帮我们弄清和它们相联系的错误类型,这样我们能快速诊断它们。另外,我们可以应用某些编程和设计技巧来显著减少这些类型错误的出现。

悬挂复合类型

我们将探讨的第一个关于空指针异常的错误类型,是一个我称之为悬挂复合类型的错误类型。这种类型的错误是这样产生的:定义的某些基本例没有被给出它们自己的类,然后以这种方法定义了一个递归的数据类型。相反,空指针被插入到不同的复合数据类型中。数据类型实例的使用就好像空指针被正确填充了一样。我称之为悬挂复合类型是因为冲突代码是复合设计类型的一个有缺点的应用程序,其中,复合数据类型包含悬挂的引用(也就是空指针)。

原因

考虑下面 LinkedList 类的单连接执行,它有一个悬挂复合类型。为了示例的简单起见,我只执行在 java.util.LinkedList 中定义的一些方法。为了显示这种类型的错误是多么隐蔽,我已经在下面代码中引入一个错误。看看你是否能发现它。

>清单 1. 单连接链表

import java.util.NoSuchElementException; public class LinkedList {   private Object first;   private LinkedList rest;   /**   * Constructs an empty LinkedList.   */   public LinkedList() {    this.first = null;    this.rest = null;   }   /**   * Constructs a LinkedList containing only the given element.   */   public LinkedList(Object _first) {    this.first = _first;    this.rest = null;   }   /**   * Constructs a LinkedList consisting of the given Object followed by   * all the elements in the given LinkedList.   */   public LinkedList(Object _first, LinkedList _rest) {    this.first = _first;    this.rest = _rest;   } }

诊断Java代码: 悬挂复合错误类型(2)

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

这段代码相当的糟糕。它在两个域中都放置一个空指针来表示空链表,而不是为空链表定义一个单独的类。一开始看来,用这种方法表示一个空链表使代码简单。毕竟,我们不必仅仅为了空链表而去定义一个额外的类。但是,正如我将证明的,这样的简单操作只是一个幻想。让我们为这个类定义一些读取器 (getter) 和设置器 (setter) 方法:

清单 2. 为 LinkedList 定义方法

public Object getFirst() {    if (! (this.isEmpty())) {     return this.first;   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号