快速业务通道

使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告 - 编程入门网

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

使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告

时间:2011-05-07 IBM 丁钦浩

概述

BEAM 报告的结果文件是通过 build.xml 中 --beam::complaint_file 所定义的,在这 里,本文假设其为 BEAM-messages。BEAM-messages 记录着报出的所有代码缺陷,这些缺陷 分为 ERROR,MISTAKE 和 WARNING 三大类,严重程度依次递减。每一个具体的 ERROR, MISTAKE 和 WARNING 都代表着一个错误模式,本文接下来就通过实例分析理解其中的某些 重要错误模式,告诉读者在写 Java 代码时如何避免这些错误模式的发生,从而写出高质量 的代码。

由于篇幅原因,本文只主要重点介绍四个常见的错误模式,并在最后简单介绍一下在编 程时还应该注意的一些其它技巧,文章结构如下:

操作空对象

数组访问越界

除 0 错误

内存泄漏

其它技巧

操作空对象

这是报出的 ERROR2 错误模式。据个人项目经验,这种错误模式出现最为频繁,但是编 程人员却往往很难发现,因为这种编译器发现不了的错误可能在代码运行很长时间时都不会 发生,可是一旦出现,程序就会终止运行,并抛出 runtime 异常 java.lang.NullPointerException。通常有以下这些情况会导致操作空对象错误模式的发生 。

调用空对象的方法

访问或修改空对象的域

访问或修改空数组对象的数组元素

同步空对象

传入空对象参数

下面让我们用简单易懂的例子一一介绍它们。

调用空对象的方法

清单 1. 调用空 String 对象的 charAt() 方法

String str = null;   int a = 0;   if( a > 0 ) {     str = new String[]{ "developer " , "Works"};   }   char ch = str.charAt(0);

这是最典型的调用空对象方法的例子,调用一个未初始化的 String 对象的 chatAt() 方法。

使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告(2)

时间:2011-05-07 IBM 丁钦浩

清单 2. 调用未初始化数组成员的方法

Integer[] array = null;   try{     array = new Integer[] { new Integer(2/0), new Integer(3), new  Integer(4) };   } catch ( Exception e ) {     //Do nothing here   }   int i = array[0].intValue();

数组 array 的三个 Integer 成员因为除数为 0 的异常并没有被初始化(这里只是用典 型的除数为 0 的异常举例,其实实际工程中,初始化时发生的异常有时很难被发现,没有 如此明显),但是接下来仍然调用其第 0 个成员的 intValue() 方法。

总结:调用空对象方法的错误非常常见,导致其出现的原因通常有两点:

在某个方法开始处定义了空对象,程序员准备在其后的代码中对其进行初始化,初始化 完毕后再调用该对象的方法。但是有时由于初始化代码中的某个不常见的 if 之类的条件不 成立或者 for/while 循环的条件不成立,导致接下来的赋值动作并没有进行,其结果就是 之前定义的空对象并没有被初始化,然后又调用该对象的方法,从而造成了 java.lang.NullPointerException,如清单 1 所示。

初始化对象时出现了异常,但是没有对异常进行特殊处理,程序接下来继续运行,导致 最终调用了该空对象的方法,如清单 2 所示。

这种代码缺陷在大型代码工程中往往很难被发现,因为编译器不会报错,而且代码在实 际运行中,可能 99% 的时候 if 条件都是满足的,初始化也是成功的,所以程序员很难在 测试中发现该问题,但是这种代码一旦交付到用户手中,发现一次就是灾难性的。

建议的解决方法:一定要明确知道即将引用的对象是否是空对象。如果在某个方法中需 要调用某个对象,而此对象又不是在本方法中定义(如:通过参数传递),这时就很难在此 方法中明确知道此对象是否为空,那

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

分享到: 更多
的内容动态改变的行高
  • 如何将装饰模式应用到servlet request对象上 - 编程入门网
  • JSP编程实现页面跳转
  • javascript探测浏览器插件
  • 新手站长谈商城站的用户体验
  • 802.1QVLAN协议和802.1P协议的实现
  • flash中的常见术语
  • 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号