快速业务通道

Java理论与实践:平衡测试,第2部分:编写和优化bug检测器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
) {    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. 标识受访问代码中抛出异常的位置

public void  sawOpcode(int seen) {   stack.mergeJumps(this);   try {     switch (seen) {     case ATHROW:        if (stack.getStackDepth() > 0) {         OpcodeStack.Item item = stack.getStackItem(0);         String signature = item.getSignature();         if (signature != null &&  signature.length() > 0) {           if (signature.startsWith("L"))             signature = SignatureConverter.convert (signature);           else              signature = signature.replace(''/'',  ''.'');           throwList.add(new ExceptionThrown(signature,  getPC()));         }       }       break;     case INVOKEVIRTUAL:      case INVOKESPECIAL:      case INVOKESTATIC:        String className = getDottedClassConstantOperand ();       try {         if (!className.startsWith("[")) {           JavaClass clazz = Repository.lookupClass (className);           Method[] methods = clazz.getMethods();           for (Method method : methods) {             if (method.getName().equals (getNameConstantOperand())                 && method.getSignature().equals(getSigConstantOperand()))  {               ExceptionTable et =  method.getExceptionTable();               if (et != null) {                 String[] names =  et.getExceptionNames();         

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号