0

我有以下代码:

void func()
{
  try
  {
    f1()
  }
  finally()
  {
     if (resource != null)
       resource.close();
  }
}

我设置了三个断点:调用 f1(),在 f1() 中,在 finally 块的 if 语句中。

似乎 finally 块中的断点没有被命中。如果在 f1() 中击中断点后我使用下一个命令,我确实最终会通过 finally 块。

此外,如果我在 finally 块的两行都设置断点,则断点确实是第一个。

不确定这是否是由于 JDB 中的错误。有人可以告诉我这是一个已知问题还是我遗漏了什么?

我在 Linux 上使用 JDK 6。

4

1 回答 1

5

我不太明白您看到了什么意外行为,但是 JDB 调试 if's、finally's 或 if's inside of finally's 没有问题。如果您看到明显的断点被跳过,那么您很可能正在查看与正在运行的字节码不同的源代码。可以通过反汇编来检查字节码中的行号

javap -c -l <simple class name>

在与类文件相同的目录中。它也可以运行为

javap -c -l -classpath <build dir> <fully qualified class name>

它将显示每个方法包含的所有指令,并带有数字标签。将有一个“LineNumberTable”将这些标签与源代码行号相关联。注意:每个源代码行通常有许多字节码指令。

于 2011-07-30T03:31:59.257 回答