使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告
2010-01-11 00:00:00 来源:WEB开发网这是最典型的调用空对象方法的例子,调用一个未初始化的 String 对象的 chatAt() 方法。
清单 2. 调用未初始化数组成员的方法
Integer[] array = null;
try{
array = new Integer[] { new Integer(2/0), new Integer(3), new Integer(4) };
} catch ( Exception e ) {
//Do nothing here
}
int i = array[0].intValue();
数组 array 的三个 Integer 成员因为除数为 0 的异常并没有被初始化(这里只是用典型的除数为 0 的异常举例,其实实际工程中,初始化时发生的异常有时很难被发现,没有如此明显),但是接下来仍然调用其第 0 个成员的 intValue() 方法。
总结:调用空对象方法的错误非常常见,导致其出现的原因通常有两点:
在某个方法开始处定义了空对象,程序员准备在其后的代码中对其进行初始化,初始化完毕后再调用该对象的方法。但是有时由于初始化代码中的某个不常见的 if 之类的条件不成立或者 for/while 循环的条件不成立,导致接下来的赋值动作并没有进行,其结果就是之前定义的空对象并没有被初始化,然后又调用该对象的方法,从而造成了 java.lang.NullPointerException,如清单 1 所示。
初始化对象时出现了异常,但是没有对异常进行特殊处理,程序接下来继续运行,导致最终调用了该空对象的方法,如清单 2 所示。
这种代码缺陷在大型代码工程中往往很难被发现,因为编译器不会报错,而且代码在实际运行中,可能 99% 的时候 if 条件都是满足的,初始化也是成功的,所以程序员很难在测试中发现该问题,但是这种代码一旦交付到用户手中,发现一次就是灾难性的。
更多精彩
赞助商链接