使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告 - 编程入门网
使用 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 对象的 chatAt() 方法。 使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告(2)时间:2011-05-07 IBM 丁钦浩清单 2. 调用未初始化数组成员的方法
数组 array 的三个 Integer 成员因为除数为 0 的异常并没有被初始化(这里只是用典 型的除数为 0 的异常举例,其实实际工程中,初始化时发生的异常有时很难被发现,没有 如此明显),但是接下来仍然调用其第 0 个成员的 intValue() 方法。 总结:调用空对象方法的错误非常常见,导致其出现的原因通常有两点: 在某个方法开始处定义了空对象,程序员准备在其后的代码中对其进行初始化,初始化 完毕后再调用该对象的方法。但是有时由于初始化代码中的某个不常见的 if 之类的条件不 成立或者 for/while 循环的条件不成立,导致接下来的赋值动作并没有进行,其结果就是 之前定义的空对象并没有被初始化,然后又调用该对象的方法,从而造成了 java.lang.NullPointerException,如清单 1 所示。 初始化对象时出现了异常,但是没有对异常进行特殊处理,程序接下来继续运行,导致 最终调用了该空对象的方法,如清单 2 所示。 这种代码缺陷在大型代码工程中往往很难被发现,因为编译器不会报错,而且代码在实 际运行中,可能 99% 的时候 if 条件都是满足的,初始化也是成功的,所以程序员很难在 测试中发现该问题,但是这种代码一旦交付到用户手中,发现一次就是灾难性的。 建议的解决方法:一定要明确知道即将引用的对象是否是空对象。如果在某个方法中需 要调用某个对象,而此对象又不是在本方法中定义(如:通过参数传递),这时就很难在此 方法中明确知道此对象是否为空,那 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |