- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用 IBM 静态工具优化 Java 代码,第 2 部分:?分析错误报告
文档选项
打印本页
将此页作为电子邮件发送
级别: 初级
丁 钦浩?(dingqinh@), 软件开发工程师, IBM
2008 年 7 月 03 日
通过本系列?第 1 部分?的介绍,读者应该可以轻松地在 Windows 上运行 BEAM,并能够对自己的 Java 工程进行代码分析了。本文我们将对其输出的报告结果文件进行分析,修改代码中的潜在错误,从而达到最根本的目的:提高代码质量。
概述
BEAM 报告的结果文件是通过 build.xml 中?--beam::complaint_file?所定义的,在这里,本文假设其为 BEAM-messages。BEAM-messages?记录着报出的所有代码缺陷,这些缺陷分为?ERROR,MISTAKE?和WARNING?三大类,严重程度依次递减。每一个具体的?ERROR,MISTAKE?和?WARNING?都代表着一个错误模式,本文接下来就通过实例分析理解其中的某些重要错误模式,告诉读者在写 Java 代码时如何避免这些错误模式的发生,从而写出高质量的代码。
由于篇幅原因,本文只主要重点介绍四个常见的错误模式,并在最后简单介绍一下在编程时还应该注意的一些其它技巧,文章结构如下:
操作空对象
数组访问越界
除 0 错误
内存泄漏
其它技巧
回页首
操作空对象
这是报出的?ERROR2?错误模式。据个人项目经验,这种错误模式出现最为频繁,但是编程人员却往往很难发现,因为这种编译器发现不了的错误可能在代码运行很长时间时都不会发生,可是一旦出现,程序就会终止运行,并抛出 runtime 异常?java.lang.NullPointerException。通常有以下这些情况会导致操作空对象错误模式的发生。
调用空对象的方法
访问或修改空对象的域
访问或修改空数组对象的数组元素
同步空对象
传入空对象参数
下面让我们用简单易懂的例子一一介绍它们。
调用空对象的方法
清单 1. 调用空 String 对象的 charAt() 方法
String str = null;
int a = 0;
if( a 0 ) {
str = new String[]{ developer , Works};
}
char ch = str.charAt(0);
这是最典型的调用空对象方法的例子,调用一个未初始化的?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?条件都是满足的,初始化也是成功的,所以程序员很难在测试中发现该问题,但是这种代码一旦交付到用户手中,发现一次就是灾难性的。
建议的解决方法:一定要明确知道即将引用的对象是否是空对象。如果在某个方法中需要调用某个对象,而此对象又不是在本方法中定义(如:通过参数传递),这时就很难在此方法中明确知道此对象是否为空,那么一定要在调用此对象方法之前先判断其是否为空,如果不为空,然后再调用其方
文档评论(0)