Зависимые условные точки останова нестроки

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

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

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

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

5
задан Dave Jarvis 22 January 2010 в 17:55
поделиться

4 ответа

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

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

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

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

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

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

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

3
ответ дан 14 December 2019 в 13:36
поделиться

Добавление двоеточий в PATH мы также можем сделать что-то вроде:

path_remove ()  { 
   declare i newPATH
   # put a colon at the beginning & end AND double each colon in-between
   newPATH=":${PATH//:/::}:"   
   for ((i=1; i<=${#@}; i++)); do
       #echo ${@:${i}:1}
       newPATH="${newPATH//:${@:${i}:1}:/}"   # s/:\/fullpath://g
   done
   newPATH="${newPATH//::/:}"
   newPATH="${newPATH#:}"      # remove leading colon
   newPATH="${newPATH%:}"      # remove trailing colon
   unset PATH 
   PATH="${newPATH}" 
   export PATH
   return 0 
} 


path_remove_all ()  {
   declare i newPATH extglobVar
   extglobVar=0
   # enable extended globbing if necessary
   [[ ! $(shopt -q extglob) ]]  && { shopt -s extglob; extglobVar=1; }
   newPATH=":${PATH}:"
   for ((i=1; i<=${#@}; i++ )); do
      newPATH="${newPATH//:+(${@:${i}:1})*([^:])/}"     # s/:\/path[^:]*//g
   done
   newPATH="${newPATH#:}"      # remove leading colon
   newPATH="${newPATH%:}"      # remove trailing colon
   # disable extended globbing if it was enabled in this function
   [[ $extglobVar -eq 1 ]] && shopt -u extglob
   unset PATH 
   PATH="${newPATH}" 
   export PATH
   return 0 
} 

path_remove /opt/local/bin /usr/local/bin

path_remove_all /opt/local /usr/local 
-121--734991-

Создание страницы на веб-сайте со следующим кодом:

JavaScriptSerializer serializer = new JavaScriptSerializer();

Response.Write("Max Length: " + serializer.MaxJsonLength);

На выходе:

Max Length: 2097152

Поэтому я бы пошел со значением, определенным в документах , а не как.

Однако обратите внимание, что это символы, а не байты явным образом:

Значение по умолчанию - 2097152 символа, что эквивалентно 4 МБ строковых данных Юникода

-121--1930429-

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

Вместо того, чтобы:

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
ответ дан 14 December 2019 в 13:36
поделиться

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

0
ответ дан 14 December 2019 в 13:36
поделиться

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

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

0
ответ дан 14 December 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: