Подтвердить что ты не робот

Есть ли эквивалент 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?

4b9b3361

Ответ 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 только для отладки, поместите точку останова где-то, о чем вы действительно заботитесь, затем щелкните ее правой кнопкой мыши и выберите свойства точки останова!

Меню правой кнопки мыши на OS X с свойствами точки останова внизу Диалоговое окно

Ответ 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();
    }