快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
置的元素已经被 remove 了, 后来仍然对该位置元素进行访问,可能会导致数组访问越界,如清单 10 。

建议的解决方法:在判断数组是否有效不为空的同时,也要对访问的数组元素的索引是 否超出了上下限进行检查,如果索引是个变量,一定要确保变量取值在数组范围之类(反例 是清单 7);如果索引不是个变量,在确保索引正确的同时还要确保之前定义的数组足够大 (反例是清单 9)。最好是使用 try/catch 访问数组,并对数组访问越界异常进行捕获, 进行特殊处理,如清单 11 。

清单 11 利用 try/catch 安全访问数组

try {   // 访问数组   }   catch( IndexOutOfBoundsException e ) {   // 捕获数组访问越界的异常并做特殊处理    }

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

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

除 0 错误

这是报出的 ERROR22 错误模式。在 Java 中,如果除数为 0,会导致 runtime 异常 java.lang.ArithmeticException 并终止程序运行,如清单 12 所示。

清单 12 除数为 0

int num = 0;    …   int a = 5 / num;

总结:导致除 0 错误的主要原因是使用变量作为除数,并且程序员在写除法语句时,以 为变量值到此已经被改变(不是 0),但是实际上可能某条不被注意的语句路径导致除数为 0,从而造成了错误。

建议的解决方法:做除法前,一定不能将除数直接写为 0 ;如果除数为变量,而且该变 量值在进行除法前经过了很多运算,导致不能确定在被除前是否为 0,则在除法前,先对除 数变量进行是否为 0 的判断,并对除数为 0 的情况做特殊处理。

内存泄漏

这是报出的ERROR23错误模式。内存泄漏的后果非常严重,即使每次运行只有少量内存泄 漏,但是长期运行之后,系统仍然会面临彻底崩溃的危险。

在 C/C++ 中,内存泄漏(Memory Leak)一直是程序员特别头疼的问题,因为它出错时 的表现特征经常很不稳定(比如:错误表象处不唯一,出错频率不定等),而且出现问题的 表象处经常与内存泄漏错误代码相隔甚远,所以很难被定位查出。在 Java 中,垃圾回收器 (Garbage Collection,GC) 的出现帮助程序员实现了自动管理内存的回收,所以很多程序 员认为 Java 不存在内存泄漏问题,其实不然,垃圾回收器并不能解决所有的内存泄漏问题 ,所以 Java 也存在内存泄漏,只是表现与 C/C++ 不同。

为什么 Java 会出现内存泄漏呢?因为垃圾回收器只回收那些不再被引用的对象。但是 有些对象的的确确是被引用的(可达的),但是却无用的(程序以后不再使用这些对象), 这时垃圾回收器不会回收这些对象,从而导致了内存泄漏,抛出异常 java.lang.OutOfMemoryError。以下是导致内存泄漏的常见的例子(其中某些例子 BEAM 很 难查出,这里列出只是为了给读者提供一个反例进行学习)。

清单 13. 内存泄漏的 Hashtable

public class HashtableLeakDemo   {   static Hashtable<Integer, String> names = new  Hashtable<Integer, String>();   void leakingHash( int num ) {   for( int i = 0; i < num; i++ ) {   names.put( new Integer(i) , "developerWorks");   }   // 接下来是继续对 names 哈希表进行的操作,但是忘了移除其中的表项    }   }

leakingHash 会往 Hashtable 中不停地加入元素,但是却没有相应的移除动作(remove ),而且 static 的 Hashtable 永远都会贮存在内存中,这样必将导致 Hashtable 越来越 大,最终内存泄漏。

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

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

清单 14. 内存泄漏的 Vector

public class VectorL

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