快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
用了错误的方法,或者假定接下来传参的函数允许空对象参数。

建议的解决方法:如果函数的参数为对象,并且在函数体中需要操作该参数(如:访问 参数对象的方法或域,试图修改参数对象的域等),一定要在函数开始处对参数是否为空对 象进行判断,如果为空则不再执行函数体,并最好作特殊处理,达到避免操作空对象的目的 。

数组访问越界

这是报出的 ERROR7 错误模式。什么是数组访问越界呢?如果一个数组(在 Java 中, Vector,ArrayList 和 List 也算是数组类型)定义为有 n 个元素,那么对这 n 个元素( 0~n-1)的访问都是合法的,如果对这 n 个元素之外的访问,就是非法的,称为“越界”。 这种错误同样不会造成编译错误,会危险地“埋伏”在你的程序中。在 C/C++ 中遇到数组 访问越界,可导致程序崩溃,甚至宕机;在 Java 中,会抛出 runtime 异常 java.lang.ArrayIndexOutOfBoundsException 或 java.lang.IndexOutOfBoundsException ,并终止程序运行。请看程序员容易犯的几个典型数组访问越界的例子:

清单 7. 越界访问 String 数组元素 1

int index = 2;   String[] names = new String[] { "developer", "Works" };   System.out.println( names[index] );

index 为 2,而数组只有两个元素,最后一个元素的下标索引是 1,所以导致数组访问 越界。注意,如果 index 为负数,仍然是数组访问越界。

清单 8. 越界访问 Vector

Vector<String> vec = new Vector<String>();   for ( int i = 0; i <= vec.size(); i ++ ) {   System.out.println( vec.get(i) );   }

Vector 和 ArrayList 的起始索引是 0,所以用其数组大小作为索引会导致数组访问越 界,其数组最后一个元素的索引应该是“数组大小 -1 ”。

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

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

清单 9. 越界访问 String 数组元素 2

int a = 0;   String[] names = null;   StringBuffer buf = new StringBuffer();   if ( a > 0 ) {     names = new String[] { "developer", "Works" };   } else {     names = new String[] { "developerWorks" };   }   buf.append( names[0] ).append( names[1] );

程序员调用 append 时以为数组 names 中有两个元素,其实只有一个。

清单 10. 越界访问 ArrayList

ArrayList<String> arrList = new ArrayList<String> ();   int len = 5;   for( int i = 0; i < len; i++ ) {   arrList.add( String.valueOf(i) );   }   arrList.remove( len - 1 );   System.out.println(arrList.get( len - 1 ));

ArrayList 中最后一个元素已经被 remove 了,所以该位置已经没有任何东西,访问它 将导致 java.lang.ArrayIndexOutOfBoundsException。

总结:导致数组访问越界主要有以下几个原因:

使用某个变量作为数组索引时,没有之前对该变量值进行检查,变量的取值可能会超出 合法的数组索引范围,从而导致数组访问越界,如清单 7 。

使用与数组元素个数相同的值作为数组索引,因为数组的最后一个元素的索引是“数组 大小 -1 ”,所以导致数组访问越界,如清单 8 。

数组初始化代码中某个不起眼的 if 之类的条件不成立或者 for/while循环的条件不成 立,导致接下来的赋值动作并没有进行,从而接下来访问了未初始化完全的数组,导致数组 访问越界,如清单 9 。

程序员编码时忘记 Vector,ArrayList 或 List 中某些位

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