|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
这一冗长系列的第1部分先容了怎样举行无效测试,它构建了FindBugs插件来查找一个复杂的bug形式(只需挪用System.gc()便可)。Bug形式会标识有成绩的编码理论,它们经常位于bug地点的地区。固然,并非一切出现bug形式的中央都必定呈现bug,但这其实不能扼杀bug形式检测器的伟大作用。一个无效bug形式检测器的次要功效是发明更高百分比的可疑代码,使该形式具有更年夜的利用代价。创立bug形式检测器能够进步利用代价;创立检测器以后,不管是如今仍是未来,您都能够在您必要的任何代码上运转它,而且您大概对发明的成绩感应惊奇。比方,第1部分中的复杂检测器显现了对System.gc()的挪用,在JDK1.4.2中,它埋没在JPEG图象I/O库中。
编写检测器能够查找对特定静态办法的挪用,这其实不坚苦,可是年夜多半的bug检测器都包括相称多的剖析和完成。在这一期的文章中,您将开辟一个称为RuntimeExceptioncapture的更小bug形式的检测器(今朝,FindBugs刊行版中已包括此bug检测器。)
RuntimeException捕捉
用Java™言语举行非常处置的一个长处是:非常是一些对象,try-catch机制懂得非常范例的分层布局,并在客户机怎样处置毛病处置方面供应实践天真性。比方,假如不克不及找到文件,则FileInputStream机关函数会抛出FileNotFoundException,该非常是IOException的一个子类。此传统用法同意客户机处置未发明文件的前提,这些前提是从其他与文件相干的前提平分离出来的(假如他们喜好独自捕捉FileNotFoundException)。可是,他们还可使用捕捉IOException的办法处置一切与文件相干的毛病前提。
另外一方面,非常处置的次要缺点是:在准确利用非常时,易于创建带有三行或四行营业逻辑和20或30行非常处置的办法。由于毛病恢复代码在测试时简单呈现毛病而且实行坚苦,使一部分专门用于非常处置的代码莫衷一是并简单堕落。这类情形的典范示比方清单所示,个中带有两行“真的”代码的办法需要三个自力的捕捉块,每一个捕捉块都实行完整不异的操纵——纪录该非常:
清单1.多个不异的捕捉块
public void addInstance(String className) {
try {
Class clazz = Class.forName(className);
objectSet.add(clazz.newInstance());
}
catch (IllegalAccessException e) {
logger.log("Exception in addInstance", e);
}
catch (InstantiationException e) {
logger.log("Exception in addInstance", e);
}
catch (ClassNotFoundException e) {
logger.log("Exception in addInstance", e);
}
}
请拜见清单1,您大概实验将三个捕捉块兼并成捕捉Exception的独自捕捉块,由于每一个捕捉块的捕捉恢复操纵是不异的。乍一看,该战略仿佛是一个好方法——但代码正本有毛病,以是整合这些复制路径应当是一种改善。不外,此“改善”经常会带来意想不到的了局。由于RuntimeException扩大了Exception,将三个捕捉块兼并成一个捕捉块(如清单2所示),以是这会变动语义,如今,未经反省的非常将被纪录(而不传布)。此bug形式(个中RuntimeException简单被超年夜捕捉块捕捉)也称为RuntimeException捕捉。
清单2.RuntimeException捕捉bug形式——不要实行此形式
public void addInstance(String className) {
try {
Class clazz = Class.forName(className);
objectSet.add(clazz.newInstance());
}
catch (Exception e) {
logger.log("Exception in newInstance", e);
}
}
<p>
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。 |
|