1

Eclipse 非常适合编写 java 程序,但今天我发现欺骗像我这样的新编码人员真是太棒了。@_@

我写了一个片段如下,

public static void main(String[] args) {
    for(int i=0;i<3;i++){
        System.out.println("i = " + i);
    }
}

然后我在“System.out.print ....”行添加一个断点,单击“Debug”按钮,eclipse进入“Debug”透视图并突出显示断点行,然后将光标移到变量上“i”,正如预期的那样,它的值是“0”。

然后,我选择“i++”并单击“Inspect”(或按“Ctrl+Shift+I”)一次,将光标移到变量“i”上,其值变为“1”。我再次重复“Inspect”,i的值变为“2”......(每次点击“Inspect”它的值都会加1)!

为什么会这样!?我只想查看调试 propuse 的“i”值,在进入下一个语句之前不想真正改变它的值。我认为“检查”和“显示”仅用于查看变量/表达式,它们不应该影响值,但在这种情况下,它不能像我预期的那样工作。

谁能告诉我出了什么问题?

My eclipse version info:
Version: Indigo Service Release 2
Build id: 20120216-1857

选择

4

4 回答 4

3

如果您检查一个表达式,eclipse 必须执行该表达式以便您可以获取该值。因此,如果您检查i++,eclipse 会在i.

这样想:如果不是 i++,而是检查myFunction(i),你会期望 eclipse 执行函数“myFunction”来获取值吗?与 相同i++

于 2012-11-09T11:37:27.833 回答
1

如果您担心在调试时显示/显示值,并且您想确保不影响值,您应该选择变量或表达式并使用“Watch”选项。

这将在不执行的情况下跟踪变量/表达式值,只需在每次运行时更新新值。我认为是最安全的方式。

于 2012-11-09T13:03:38.503 回答
1

在 Eclipse 中,如果您检查一个表达式,则 Eclipse 执行该表达式并为您提供结果。
所以在你的情况下,如果你检查i++然后 eclipse 执行它并增加i. 只要你运行这个,这将增加i.

于 2012-11-09T11:42:02.567 回答
0

正如 Pablo 所提到的,它必须评估代码才能告诉您它返回的值。相反,您可以将手表放在“i+1”上,这将为您提供您想要的价值,而不会产生您不想要的副作用。

基本上,您需要了解您启动的任何内容的任何副作用,无论是来自“主”代码还是来自调试工具。正如 Erhannis 所提到的,这有时对于在调试代码时修改值非常有用。(例如,您可以在实际调整代码之前验证调整/修复确实有用。)

您期待“一个隔离区域”,但这将非常难以做到,尤其是在许多对象链接到许多其他对象的面向对象的上下文中。并行运行整个事情有时可能会奏效,但你会失去上面的调整能力。在任何情况下,你都会遇到大量争夺资源的问题;例如,两个副本都试图读取/写入特定文件,例如日志文件。此外,两条执行路径可能会出现分歧,从而导致不正确/误导的监视值。

因此,防止这种副作用在这里并不是一个真正可行的选择,而且无论如何也很少有用。只是期望手表可以反映和影响代码执行。

于 2014-06-19T23:03:59.153 回答