首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非线相关条件断点

非线相关条件断点
EN

Stack Overflow用户
提问于 2010-01-22 15:08:24
回答 4查看 455关注 0票数 5

是否可以设置断点,使程序在指令确定条件true后停止执行?

一个类有一个名为currency的变量,我希望创建一个断点,使程序在currency == 20之后的任何行停止。我不知道更改currency的行号,所以这就像在我们类ed的每一行中放置一个断点一样。currency被更改的地方。

有什么方法可以做到这一点(除了在每一行中添加一个断点)?

我正在使用NetBeans,但任何其他IDE中的解决方案都是受欢迎的。

EN

回答 4

Stack Overflow用户

发布于 2010-01-22 15:09:46

下面是关于在NetBeans:http://www.java-hair.com/?p=61中设置条件断点的链接

有关案文:

In NetBeans,创建一个断点,右键单击表示中断的粉红小方块。点击“自定义”。当出现自定义对话框时,选中“条件”并填写条件。上面是NetBeans中这个对话框的一个例子。

它们还包括Eclipse和JDeveloper。

编辑:作为对你的评论的回应-不,这不能按照你想要的方式来做。调试器设置断点的方式是在设置断点的指令中更改字节。在计算指令时,该字节的存在将控制传递给调试器,调试器将该字节替换为以前存在的任何字节。当恢复执行时,调试器将指令指针移动到设置断点的指令。

然后,单行上的条件断点很容易实现--当控制转移到调试器时,他只需检查条件,如果条件不是真,则自动恢复执行。

那么,如果不必将条件断点附加到行中,它将如何工作?它必须连接到每一行(正如您所猜测的那样,您需要这样做才能达到此效果)。我还没有这样做的必要,但我认为这是不可取的,因为它会大大减慢程序的执行速度。更好的方法可能是使用IDE在代码中搜索所有货币实例,以查看其设置位置,并在代码周围放置条件断点。

票数 3
EN

Stack Overflow用户

发布于 2010-01-22 17:45:10

改变你编写软件的方式。

而不是:

代码语言:javascript
复制
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;
  }
}

这样做:

代码语言:javascript
复制
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; }
}

这不仅有助于维护您的代码(没有代码重复),而且还保持了一个充满可能性的世界。它可能无助于您当前的问题,但它将帮助您避免一些问题在未来。

这是一种称为封装的技术,与信息隐藏密切相关。

票数 3
EN

Stack Overflow用户

发布于 2010-01-22 16:40:59

这在Intellj和Eclipse以及其他类型的默认断点中都是可能的。此功能是IDE的函数,而不是JVM的函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2118128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档