2
public static void main(String args[])
{
  if(true)
    {
      int x= 3*44+7;
      //int y=1;
    }
}

我将我的问题缩小到这个简单的语句,我真的不知道如何在 eclipse 调试器中访问这个变量。它总是发生在变量在 if 条件、try-catch 语句、循环等中声明的情况下,并且意外地是该块中的最后一个语句。

为了解决这个问题,我停止调试会话,向该块添加另一个语句,重做我刚刚做的所有事情。有更好的解决方案吗?

4

4 回答 4

2

运行最后一个“语句”,只是您看不到变量结果,因为:

  1. 该变量在此语句之前不存在。

  2. 执行语句时变量不存在 - 最后一步是将结果值分配给变量。

  3. 该变量将存在于下一行,但该行结束了声明该变量的范围,因此该变量不再存在。

在一个更“真实世界”的例子中,你可以做这样的事情 -

改变:

public int doIt() {
    return 3*44+7;
}

至:

public int doIt() {
    int x = 3*44+7;
    return x;
}

并在“返回”行设置断点。

于 2013-06-05T14:47:34.540 回答
2

你是对的,很难看到最后一条语句的值:当你通过最后一行时,程序终止。

解决方法可以是在此语句之后添加虚拟行并将断点放在那里,或者使用“表达式”视图并将x(ie 3*44+7) 的表达式放在那里。

顺便说一句,请注意这不是现实世界中程序比 1 个可执行行长一点的典型情况。:)

于 2013-06-05T14:42:05.473 回答
1

在您的情况下,编译器实际上可能会删除分配,因为以后永远不会使用变量 x 。

无论如何...您可以在调试器中使用的一种解决方法(假设您要调试的语句不是状态更改)是使用剪贴簿或使用检查。

http://www.ibm.com/developerworks/library/os-ecbug/ 图 7 和 8

您可以突出显示一个表达式(语句的一部分或整个语句)并检查我相信。(几个月没用过eclipse)。另一种方法是停在该行(因此在表达式触发之前)并将该行复制到您的显示视图中,然后在那里运行它。

它将在当前堆栈帧内运行,因此您的所有本地对象都可用。但是,运行 set 和其他状态更改调用实际上会更改程序的状态。(这并不理想,但它胜过停止调试器)

于 2013-06-05T14:49:18.610 回答
1

我看不到您的问题的任何解决方案。由于您只能看到当前行之前定义的变量,因此您显然需要在变量声明之后声明。如果没有语句,则您的变量不再在当前范围内(在您的情况下,您的程序结束),因此无法查询。

顺便说一句,您说您停止了调试会话。使用 HotSwap,您可以动态替换当前方法的代码并在方法开始时重新启动调试(请参阅调试器中的“拖放到帧”)

于 2013-06-05T14:47:41.250 回答