使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告
2010-01-11 00:00:00 来源:WEB开发网ArrayList 中最后一个元素已经被 remove 了,所以该位置已经没有任何东西,访问它将导致 java.lang.ArrayIndexOutOfBoundsException。
总结:导致数组访问越界主要有以下几个原因:
使用某个变量作为数组索引时,没有之前对该变量值进行检查,变量的取值可能会超出合法的数组索引范围,从而导致数组访问越界,如清单 7 。
使用与数组元素个数相同的值作为数组索引,因为数组的最后一个元素的索引是“数组大小 -1 ”,所以导致数组访问越界,如清单 8 。
数组初始化代码中某个不起眼的 if 之类的条件不成立或者 for/while循环的条件不成立,导致接下来的赋值动作并没有进行,从而接下来访问了未初始化完全的数组,导致数组访问越界,如清单 9 。
程序员编码时忘记 Vector,ArrayList 或 List 中某些位置的元素已经被 remove 了,后来仍然对该位置元素进行访问,可能会导致数组访问越界,如清单 10 。
建议的解决方法:在判断数组是否有效不为空的同时,也要对访问的数组元素的索引是否超出了上下限进行检查,如果索引是个变量,一定要确保变量取值在数组范围之类(反例是清单 7);如果索引不是个变量,在确保索引正确的同时还要确保之前定义的数组足够大(反例是清单 9)。最好是使用 try/catch 访问数组,并对数组访问越界异常进行捕获,进行特殊处理,如清单 11 。
清单 11 利用 try/catch 安全访问数组
try {
// 访问数组
}
catch( IndexOutOfBoundsException e ) {
// 捕获数组访问越界的异常并做特殊处理
}
除 0 错误
这是报出的 ERROR22 错误模式。在 Java 中,如果除数为 0,会导致 runtime 异常 java.lang.ArithmeticException 并终止程序运行,如清单 12 所示。
更多精彩
赞助商链接