解析Java代码经常出现的错误
作者:网络转载 发布时间:[ 2012/11/13 11:38:36 ] 推荐标签:
尽管这段代码在几个方面都是有问题的,但是在测试中很容易漏掉这个错误。下面列出了这段代码所存在的三个问题:
1、语句os.close()在两处出现,多此一举,而且会带来维护方面的麻烦。
2、上面的代码仅仅处理了Exception,而没有涉及到Error。但是当try块运行出现了Error,流也应该被关闭。
3、close()可能会抛出异常。
上面代码的一个更优版本为:
OutputStream os = null; try{
os = new OutputStream ();
// Do something with os here.
}
finally{
if (os != null) os.close();
}
这个版本消除了上面所提到的两个问题:代码不再重复,Error也可以被正确处理了。但是没有好的方法来处理第三个问题,也许好的方法是把close()语句单独放在一个try/catch块中。
十、常见错误10#:增加不必要的catch 块
一些开发者听到try/catch块这个名字后,会想当然的以为所有的try块必须要有与之匹配的catch块。
C++程序员尤其是会这样想,因为在C++中不存在finally块的概念,而且try块存在的理由只不过是为了与catch块相配对。
增加不必要的catch块的代码象下面的样子,捕获到的异常又立即被抛出:
try{
// Nifty code here
}
catch(Exception e){
throw e;
}
finally{
// Cleanup code here
}
不必要的catch块被删除后,上面的代码缩短为:
try{
// Nifty code here
}
finally{
// Cleanup code here
}
常见错误11#;没有正确实现equals,hashCode,或者clone 等方法
方法equals,hashCode,和clone 由java.lang.Object提供的缺省实现是正确的。不幸地是,这些缺省实现在大部分时候毫无用处,因此许多类覆盖其中的若干个方法以提供更有用的功能。但是,问题又来了,当继承一个覆盖了若干个这些方法的父类的时候,子类通常也需要覆盖这些方法。在进行代码审查时,应该确保如果父类实现了 equals,hashCode,或者clone等方法,那么子类也必须正确。正确的实现equals,hashCode,和clone需要一些技巧。
小结
我在代码审查的时候至少遇到过一次这些错误,我自己也犯过其中的几个错误。好消息是只要你知道你在找什么错误,那么代码审查很容易管理,错误也很容易被发现和修改。即便你找不到时间来进行正规的代码审查,以自审的方式把这些错误从你的代码中根除会大大节省你的调试时间。花时间在代码审查上是值得的。

sales@spasvo.com