在Eclipse中的条件中调试最后一个语句是不可能的?

时间:2013-06-05 14:37:09

标签: java eclipse debugging

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

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

要解决此问题,我将停止调试会话,向该块添加另一个语句,重做我刚才所做的一切。有更好的解决方案吗?

4 个答案:

答案 0 :(得分:2)

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

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

BTW请注意,这不是现实世界中典型情况,其中程序比1个可执行行略长。 :)

答案 1 :(得分:2)

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

  1. 在此声明之前该变量不存在。

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

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

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

    变化:

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

    要:

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

    并在'return'行设置断点。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

在您的情况下,编译器可能实际上删除了赋值,因为变量x以后从未使用过。

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

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

你可以突出显示一个表达式(一个声明或整个声明的一部分)并检查我相信。 (几个月内没有使用过eclipse)。替代方法是停在该行(因此在表达式触发之前)并将该行复制到显示视图中,并在那里运行。

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