Есть ли эквивалент asm nop в java?
Когда я программирую C/С++ с Visual Studio, я часто использую команду __asm nop;
, чтобы вставить код noop, чтобы что-то сломалось. Например:
if (someCondition())
{
__asm nop;
}
Я не знаю, что делать, когда возникает условие, но я хочу остановить выполнение и проверить текущее состояние. Иногда someCondition()
достаточно просто создать условную точку останова, но условные точки останова значительно замедляют выполнение, к тому же это не всегда возможно.
Теперь, в С#, я врывался в отладчик напрямую, вызывая System.Diagnostics.Debugger.Break()
или System.Diagnostics.Debugger.Launch()
.
Теперь мне приходится программировать Java, и до сих пор я не нашел лучшей альтернативы, чем просто сделать System.out.println("bla-bla")
и установить там точку останова. Опять же, пожалуйста, рассмотрите случай, когда условная точка останова невозможна.
Итак, мне интересно - есть ли альтернатива __asm nop
или System.Diagnostics.Debugger.Break()
в Java?
Ответы
Ответ 1
В байт-коде у вас есть инструкция nop
, но на языке Java нет инструкции nop
.
Вы можете добавить дополнительный ;
в строку самостоятельно, и код все равно будет компилироваться, но это не намного более значимо, чем добавление пустой строки.
Другое выражение "ничего не делает":
assert true;
который не имеет побочных эффектов, что так всегда, и может быть отключен при выполнении программы.
Как оказалось, assert true
, похоже, не генерирует никаких инструкций байткода, что приводит к тому, что точки останова на assert true будут пропущены вместе. Тем не менее Eclipse может сломать оператор, например
assert Boolean.TRUE;
что очень похоже.
Ответ 2
Вы можете просто ввести произвольный оператор присваивания, который ничего не делает, например
if (someCondition()) {
int t=0;
}
Отладчик будет рад воспользоваться этим. Поскольку t
является локальным для блока, он не может иметь никаких побочных эффектов (и будет получать JIT-компиляцию из производственного кода).
В качестве альтернативы вы можете написать статическую функцию, в которой постоянно установлена точка останова, поэтому вы можете просто:
if (someCondition()) {
breakPoint();
}
Ответ 3
Java интерпретирует это как пустой оператор:
;
Хотя, как отмечено в комментариях, Eclipse не позволит вам установить точку останова здесь. Если вам нужно что-то бесполезное, вы можете поставить точку останова на то, что также приятно и легко напечатать, я предлагаю:
if(false){}
Ваш компилятор может предупредить вас, что это никогда не вводится, что может быть полезно для напоминания о том, чтобы вывести его перед компиляцией для производства. Надеюсь, это поможет!
Ответ 4
Я отделяю это от нового ответа, потому что я удивлен, что никто этого не сказал. Современные IDE позволяют добавлять логику к точкам останова! Вместо компиляции выделенного оператора if
только для отладки, поместите точку останова где-то, о чем вы действительно заботитесь, затем щелкните ее правой кнопкой мыши и выберите свойства точки останова!
![Диалоговое окно]()
Ответ 5
Я не нашел идеального решения для этого, но вот решение, которое мне больше всего нравится. Вероятно, неэффективен, но позволяет разместить точку останова, Eclipse не жалуется и не предупреждает, а с точки зрения кода читателя очевидно, что вы хотите сделать.
// Silly method that allows me to make noop
private static void noop() {
}
public otherMethod() {
// Here I need breakpoint
noop();
}
Если я хочу использовать контрольную точку предварительного условия, поставьте условие до:
public otherMethod() {
// Here I need breakpoint
if(someCondition())
noop();
}