Нелинейно-зависимые условные точки останова - PullRequest
5 голосов
/ 22 января 2010

Можно ли установить точку останова, чтобы программа перестала выполняться после того, как инструкция выполнила определенное условие true?

В классе есть переменная с именем currency, и я хочу создать точку останова, чтобы программа остановилась на любой строке после currency == 20. Я не знаю номер строки, где currency изменен, так что это все равно что поставить точку останова в каждой строке моего класса [изд. где currency будет изменено].

Есть ли способ сделать это (кроме добавления точки останова в каждой строке)?

Я использую NetBeans, но приветствуется решение в любой другой IDE.

Ответы [ 4 ]

3 голосов
/ 22 января 2010

Измените способ написания программного обеспечения.

Вместо:

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; }
}

Это не только помогает в поддержании вашего кода (без дублирования кода), но и открывает целый мир возможностей. Возможно, это не поможет вам решить текущую проблему, но поможет избежать ряда проблем в будущем.

Этот метод называется инкапсуляция и тесно связан с сокрытием информации .

3 голосов
/ 22 января 2010

Вот ссылка на установку условных контрольных точек в NetBeans: http://www.java -hair.com /? P = 61

Соответствующий текст:

В NetBeans создайте точку останова, щелкните правой кнопкой мыши на маленький розовый квадрат это означает разрыв. Нажмите на «Настройка». Когда диалог настройки подходит, проверьте «Условие» и заполните в состоянии. Выше приведен пример этого диалога в NetBeans.

Они также охватывают Eclipse и JDeveloper.

Редактировать : в ответ на ваш комментарий - нет, это нельзя сделать так, как вы этого хотите. Отладчик устанавливает точку останова путем изменения байта в инструкции, в которой установлена ​​точка останова. Когда инструкция оценивается, присутствие этого байта передает управление отладчику, который заменяет байт тем, что было раньше. Когда выполнение возобновляется, отладчик перемещает указатель команды на инструкцию, в которой была установлена ​​точка останова.

Условную точку останова в одной строке легко внедрить - когда управление переходит к отладчику, он просто проверяет условие, а если оно неверно, он автоматически возобновляет выполнение.

Итак, как бы это работало, если бы вам не нужно было присоединять условную точку останова к строке? Он должен быть прикреплен к каждой отдельной строке (как вы и предполагали, в противном случае вам нужно было бы сделать этот эффект). У меня не было необходимости делать это, но я думаю, что это было бы нежелательно, поскольку это значительно замедлило бы выполнение программы. Лучшим подходом может быть использование вашей IDE для поиска в коде всех экземпляров валюты, чтобы увидеть, где она может быть установлена, и установка там условных точек останова.

0 голосов
/ 22 января 2010

В Eclipse можно установить условную точку останова, которая будет проверяться при изменении переменной.

Однако общие условия не могут быть нарушены "в тот самый момент, когда это сложное условие становится истинным"

0 голосов
/ 22 января 2010

Это возможно как в Intellj IDEA, так и в Eclipse, наряду с другими типами условных точек разрыва. Эта функция является функцией вашей IDE, а не JVM.

...