当前位置: 首页 > 知识库问答 >
问题:

通过分析字节码,我如何从catch块中检测显式的throw语句调用?

马哲
2023-03-14
try 
{
    def();
}
catch (IOException e)
{
    throw e;
}
catch (Exception e)
{
    throw new RuntimeException(e);
}

现在我必须使用一个直接处理字节码的框架(BAT-Bytecode Analysis Toolkit)。

首先,catch块在字节码中是如何表示的?如何检测其中的抛出语句?

共有1个答案

任昊阳
2023-03-14

每个方法都有一个异常表,该表将指令和异常类型的范围映射到异常处理程序(它的入口点)。这并不总是很容易翻译回Java代码。但通常,您需要检查这个表,然后分析从这些入口点可到达的代码。所有这些代码都属于catch子句。那么这只是识别athrow指令的问题。

使用javap或其他好的字节码可视化工具进行操作并更好地理解它。完成代码、编译代码并使其服从javap将产生:

public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void def()   throws java.io.IOException;
  Code:
   0:   new     #2; //class java/io/IOException
   3:   dup
   4:   invokespecial   #3; //Method java/io/IOException."<init>":()V
   7:   athrow

public static void main(java.lang.String[])   throws java.io.IOException;
  Code:
   0:   invokestatic    #4; //Method def:()V
   3:   goto    19
   6:   astore_1
   7:   aload_1
   8:   athrow
   9:   astore_1
   10:  new     #6; //class java/lang/RuntimeException
   13:  dup
   14:  aload_1
   15:  invokespecial   #7; //Method java/lang/RuntimeException."<init>":(Ljava/lang/Throwable;)V
   18:  athrow
   19:  return
  Exception table:
   from   to  target type
     0     3     6   Class java/io/IOException

     0     3     9   Class java/lang/Exception


}

对于main方法,我们有两个异常入口点(“targets”):6和9。在6之后,我们在偏移量8处有一个athrow。在入口点9之后,我们在偏移量18处有一个athrow。就是这样!

 类似资料:
  • 在我必须进行的猜测游戏中,我需要包含一个带有两个catch子句的try-catch块(一个多catch块用于我的两个自定义异常:和,一个块用于)。 我试图在程序中创建条件来抛出自定义异常,因为我不知道它们如何正常工作的逻辑。我有编译错误,希望能帮助重新运行我的程序,以便它正确地实现try-catch块。 我的自定义异常类: 我的程序有编译错误:

  • 本文向大家介绍JavaScript语句错误throw、try及catch实例解析,包括了JavaScript语句错误throw、try及catch实例解析的使用技巧和注意事项,需要的朋友参考一下 try 语句测试代码块的错误。 catch 语句处理错误。 throw 语句创建自定义错误。 finally 语句在 try 和 catch 语句之后,无论是否有触发异常,该语句都会执行。 JavaScr

  • 我有一个包含两个方法的类,每个方法都有一个try-catch块来查找任何异常。 代码如下: 我提出了一个测试用例,使用Mokito来测试上述场景,但不知道如何进入上述的catch块 我试图提出一个NullPointerException,但catch块仍然没有出现在CodeOverage中(我假设它没有经过测试)。请帮我写一个Junit测试用例来输入异常。我对所有这些话题都很陌生。

  • 问题内容: 我读取了大约1000个文件名,其中一些文件以UTF8编码,而某些文件为CP1252。 我想将它们全部解码为Unicode,以便在脚本中进行进一步处理。有没有一种方法可以使源编码正确解码为Unicode? 例: 问题答案: 如果您的文件位于和中,则有一种简单的方法。 否则,有一个字符集检测库。 Python-检测字符集并转换为utf-8 https://pypi.python.org/p

  • 问题内容: 在内部使用try / catch或在内部使用try / catch的正确方法是什么? 与 问题答案: 在我看来,我的观点是: 以上是正确的方法。 因为,使用这种方法,如果与数据库的连接存在异常,则将其捕获在catch块内。但是使用第一种方法,则不会。

  • 如何通过CBC或ECB模式检测邮件是否为加密? 我已经做了一个函数,它可以在AES 128 CBC或ECB中随机加密,我可以在明文和密文之间进行汉明,但与密码模式无关。 如何检测分组密码模式? 先谢谢你