Действительно ли возможно установить точку останова так, чтобы программа прекратила выполняться после того, как инструкция сделала определенное условие true
?
Класс имеет названную переменную currency
и я хочу сделать точку останова, чтобы заставить программу остановиться в любой строке после currency == 20
. Я не знаю номера строки где currency
изменяется, таким образом, это было бы похоже на помещение точки останова в каждой строке моего класса [редактор где currency
изменяется].
Там какой-либо путь состоит в том, чтобы выполнить это (помимо добавления точки останова в каждой строке)?
Я использую NetBeans, но решение в любом другом IDE приветствуется.
Вот ссылка на установленные условные точки останова в NetBeans: http://www.java-hair.com/?p=61
Соответствующий текст:
В NetBeans создайте точку останова, щелкните правой кнопкой мыши на маленькой розовой площади это означает перерыв. Нажмите на «Настроить». Когда диалог настраивания подходит, проверьте «условие» и заполните в состоянии. Выше является примером Из этого диалога в NetBeans.
Они также покрывают Eclipse и JDeveloper.
Редактировать : В ответ на ваш комментарий - нет, это не может быть сделано так, как вы этого хотите. Путь отладчик устанавливает точку останова, изменяя байт в инструкции, где установлен точка останова. Когда инструкция оценивается, наличие этого байта передает контроль от отладчика, который заменяет байт с тем, как там было раньше. При возобновлении выполнения отладчик перемещает указатель инструкции на инструкцию, где был установлен точка останова.
Условная точка останова на одну строку затем простой в реализации - при управлении переводами в отладчик, он просто проверяет условие, и если он не соответствует действительности, он автоматически возобновляет выполнение.
Итак, как это будет работать, если вам не нужно было прикрепить условный точку останова к линии? Это должно быть приятно прикреплено к каждой одной строке (как вы предполагаете, вам нужно будет сделать для достижения этого эффекта в противном случае). Мне не было необходимости сделать это, но я представляю, что это будет нежелательно, так как он значительно замедляет выполнение программы. Лучшим подходом может быть использование вашей IDE для поиска по коду для всех экземпляров валюты, чтобы увидеть, где он может быть установлен, и поставить условные точки останова.
Добавление двоеточий в 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
Поэтому я бы пошел со значением, определенным в документах , а не как.
Однако обратите внимание, что это символы, а не байты явным образом:
-121--1930429-Значение по умолчанию - 2097152 символа, что эквивалентно 4 МБ строковых данных Юникода
Измените способ записи программного обеспечения.
Вместо того, чтобы:
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; }
}
Это не только помогает поддерживать ваш код (без дублирования кода), но и открывает мир возможностей. Это может не помочь вам в решении вашей текущей проблемы, но поможет вам избежать ряда проблем в будущем.
Этот метод называется инкапсуляция и тесно связан с скрытием информации .
Это возможно в Идеме Intellegy, так и Eclipse, наряду с другими типами пунктов разрыва при проведении. Эта функциональность является функцией вашего IDE, а не JVM.
В Eclipse можно установить условную точку останова, которая будет проверяться при изменении переменной.
Однако общие условия не могут быть нарушены "в тот самый момент, когда это сложное условие становится верным"