使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告 - 编程入门网
置的元素已经被 remove 了, 后来仍然对该位置元素进行访问,可能会导致数组访问越界,如清单 10 。
建议的解决方法:在判断数组是否有效不为空的同时,也要对访问的数组元素的索引是 否超出了上下限进行检查,如果索引是个变量,一定要确保变量取值在数组范围之类(反例 是清单 7);如果索引不是个变量,在确保索引正确的同时还要确保之前定义的数组足够大 (反例是清单 9)。最好是使用 try/catch 访问数组,并对数组访问越界异常进行捕获, 进行特殊处理,如清单 11 。 清单 11 利用 try/catch 安全访问数组
使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告(6)时间:2011-05-07 IBM 丁钦浩除 0 错误 这是报出的 ERROR22 错误模式。在 Java 中,如果除数为 0,会导致 runtime 异常 java.lang.ArithmeticException 并终止程序运行,如清单 12 所示。 清单 12 除数为 0
总结:导致除 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
leakingHash 会往 Hashtable 中不停地加入元素,但是却没有相应的移除动作(remove ),而且 static 的 Hashtable 永远都会贮存在内存中,这样必将导致 Hashtable 越来越 大,最终内存泄漏。 使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告(7)时间:2011-05-07 IBM 丁钦浩清单 14. 内存泄漏的 Vector
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |