2012-11-09 26 views
1

Eclipse对于编写Java程序非常棒,但今天我发现,欺骗像我这样的新编码员是很棒的。 @ _ @eclipse的检查功能让我像个假人一样,为什么在调试时看起来很棘手?

我写的一个片段如下,

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

然后我在的行添加一个断点“......是System.out.print”,单击“调试”按钮,进入月食到“调试”的角度并突出显示断点行,然后将光标移到变量“i”上,其值为“0”。然后,我选择“i ++”,然后单击“检查”(或按“Ctrl + Shift + I”)一次,将光标移动到变量“i”上,将其值更改为“1”。我再次重复“检查”,我的值变为“2”......(每次点击“检查”时,它的值将加1)!

为什么会发生这种情况!?我只想看看调试propuse的“我”的价值,不想真正改变它的价值,直到我进入下一个陈述。我认为“检查”以及“显示”仅用于查看变量/表达式,它们不应该影响该值,但在这种情况下,它并不像我所期望的那样工作。

谁能告诉我哪里出了问题?

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

Select "i++" and click "Inspect"

回答

3

如果您检查一个表达式,日蚀来执行表达这样你就可以得到价值。因此,如果你检查i++,eclipse会增加一个到i

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

+0

是的,它的行为你说什么,我预计它仅分析“我++”表达一个隔离区域,并返回我的价值,而不是影响的实际价值的“i”,“显示”,似乎行为相同作为“检查”的方式。 – vicd

+0

@vicd但是为了评估一个孤立区域中的表达式,eclipse可能会被迫复制很多可能被改变的值,例如,如果调用一个函数,几乎所有的变量都可能被改变。 – Pablo

+0

em,似乎我们需要注意在表达式和方法上使用“Inspect”/“Display”,因为它可能会导致副作用,这是我们不想要的。例如,如果一个方法“int deposit()”加上用户银行账户余额并返回当前余额,当我“检查”两次时,这将加上余额两次!换句话说,如果使用不当,“检查”是危险的。请纠正我,如果我错了,谢谢。 – vicd

1

在eclipse中,如果你检查一个表达式,然后eclipse执行该表达式并给出结果。
所以在你的情况下,如果你检查i++然后日食执行它并增加值i。尽可能多的时候,这会增加值i

+0

以我的观点来看,这不是很友善。我只希望它评估价值并将其返还给我,而不是更改变量的价值。 – vicd

1

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

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

+1

感谢您的建议,我经常用手表来检查变量的值。我通常在调试的“表达式”选项卡中添加变量,并且它对于监控非常方便。另外,你是否发现“手表”也像“检查”/“显示”一样,每当你点击一个表达式时,它都会影响到变量的实际值。 – vicd

+1

因此,在这种情况下,我认为它充满了调试技巧:-),当我刚接触它时,很容易使我感到困惑。 – vicd

0

正如Pablo提到的那样,它必须评估代码才能告诉你它返回的值。你可以把手表放在“i + 1”上,这会给你想要的价值,而不会产生你不想要的副作用。

基本上,您需要注意任何启动的任何副作用,无论是从“主”代码还是从调试工具。正如Erhannis所说,在调试代码时修改数值时,这个功能非常有用。 (例如,您可以在实际调整代码之前验证调整/修复确实有帮助。)

您曾期待过“隔离区”,但这样做非常困难,特别是在面向对象的环境中许多对象链接到许多其他对象。平行运行整个事件有时可能会奏效,但是你会失去上面的调整能力。在任何情况下,你都会遇到大量的资源争夺问题;例如这两个副本都试图读取/写入诸如日志文件之类的特定文件。另外,这两个执行路径可能会发生偏差,导致不正确的/误导性的值。

因此,预防这种副作用是不是真的在这里一个可行的选择,很少会是有用的反正。只要期望手表既可以反映又可以影响代码执行。

相关问题