是否可以设置断点,以便在指令处于某种条件true
后程序停止执行?
一个类有一个名为currency
的变量,我想创建一个断点,使程序在currency == 20
之后的任何一行停止。我不知道currency
被更改的行号,所以这就像在我的班级的每行中放置一个断点[编辑。 currency
变更的地方。
有没有办法实现这一点(除了在每一行添加一个断点)?
我正在使用NetBeans,但欢迎在任何其他IDE中使用解决方案。
答案 0 :(得分:3)
以下是有关在NetBeans中设置条件断点的链接:http://www.java-hair.com/?p=61
相关文字:
在NetBeans中,创建一个断点 右键点击粉红色的小方块 这意味着休息。点击 “定制”。自定义对话框时 出现,检查“条件”并填写 在这种情况下。以上就是一个例子 在NetBeans中使用此对话框。
它们还包括Eclipse和JDeveloper。
修改:响应您的评论 - 不,这不能按您希望的方式完成。调试器设置断点的方法是更改设置断点的指令中的字节。当评估指令时,该字节的存在将控制转移到调试器,调试器用之前的任何内容替换该字节。当恢复执行时,调试器将指令指针移动到设置断点的指令。
单行上的条件断点很容易实现 - 当控制转移到调试器时,他只是检查条件,如果不是,则自动恢复执行。
那么,如果您不必将条件断点附加到一行,它将如何工作?它必须附加到每一行(就像你猜测你需要做的那样才能实现这个效果)。我没有必要这样做,但我想这将是不可取的,因为它会大大减慢程序执行速度。更好的方法可能是使用您的IDE搜索所有货币实例的代码,以查看它可能设置的位置,并在那里放置条件断点。
答案 1 :(得分:3)
改变你编写软件的方式。
而不是:
public class BreakEncapsulation {
private float currency = 0.0;
public BreakEncapsluation() {
this.currency += 5;
}
public void updateCurrency() {
this.currency = 20.0;
}
public void increaseCurrencyByRate() {
this.currency += 2;
}
public void decreaseCurrencyByRate() {
this.currency -= 2;
}
}
这样做:
public class HonourEncapsulation {
private float currency;
public HonourEncapsluation() {
setCurrency( getCurrency() + 5 );
}
public void updateCurrency() {
setCurrency( 20.0 );
}
public void increaseCurrencyByRate() {
setCurrency( getCurrency() + getRate() );
}
public void decreaseCurrencyByRate() {
setCurrency( getCurrency() - getRate() );
}
public void setCurrency( float currency ) {
System.out.println( "Old currency = " + this.currency );
// Set the break point here. This is the only spot in the entire system
// where the value of currency changes. This idea follows the DRY
// principle: every piece of information should have exactly one
// occurrence.
//
this.currency = currency;
System.out.println( "New currency = " + this.currency );
}
private float getCurrency() { return this.currency; }
private float getRate() { return 2.0; }
}
这不仅有助于维护代码(无代码重复),还可以保持开放的可能性。它可能对您当前的问题没有帮助,但它将帮助您避免将来出现许多问题。
这是一种名为 encapsulation 的技术,与信息隐藏密切相关。
答案 2 :(得分:0)
这在Intellij IDEA和Eclipse中都是可能的,以及其他类型的条件断点。此功能是IDE的功能,而不是JVM。
答案 3 :(得分:0)
在Eclipse中,可以设置在更改变量时要检查的条件断点。
但是,一般条件不可能被打破“这个复杂条件变为真的那一刻”