Java理论与实践:平衡测试,第2部分:编写和优化bug检测器 - 编程入门网
) {
super.visit(obj);
int type = obj.getCatchType();
if (type == 0) return;
String name =
getConstantPool().constantToString(getConstantPool ().getConstant(type));
ExceptionCaught caughtException =
new ExceptionCaught(name, obj.getStartPC(), obj.getEndPC (), obj.getHandlerPC());
catchList.add(caughtException);
}
}
Java理论与实践:平衡测试,第2部分:编写和优化bug检测器(3)时间:2010-12-22 IBM Brian Goetz标识抛出的异常 此时,您已获得了您需要的一半信息:在何处捕获哪些异常。现在必须找出 哪些异常被抛出。为此,您需要重写 BytecodeScanningDetector 的 sawOpcode() 方法,并处理与方法调用和异常抛出相对应的字节码。可以根据 athrow JVM 指令抛出异常。三个 JVM 指令分别用于调用以下方法: invokestatic、invokevirtual 和 invokespecial。就像使用 visit (CodeException) 一样,在调用超类 visit(Code) 时可以调用 sawOpcode,这 样,如果在 sawOpcode() 中收集信息,那么在 super.visit(Code) 返回时,您 将获得您需要的、有关捕获和抛出异常的所有信息。 清单 5 显示了 sawOpcode() 的实现,它将处理上述 JVM 指令。对于 athrow 指令,可以使用 FindBugs 的 OpcodeStack 帮助器类来了解 athrow 操 作数的类型。对于方法调用指令,可以使用 Bytecode Engineering Library (BCEL) 类来提取方法声明抛出的已检查异常的类型。在任何一种情况下,都可 以积累关于哪些异常在方法中的哪个字节码偏移量被抛出的信息,这样,在完成 整个方法的处理后,可以将它们进行匹配。 清单 5. 标识受访问代码中抛出异常的位置
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |