Если вы не являетесь платным участником Medium, вы можете прочитать это здесь.

Отладка кода иногда может быть сложной для новичков, но это не так сложно, как кажется. В этом посте я объясню отладку в IntelliJ, начиная с основ. Я не буду описывать все особенности. Это те, которые я использую больше всего.

Требования

Для этого нет требований.

Моя мотивация

Раньше я отлаживал свой код с помощью System.out.println();, и это меня устраивало. У меня не было никаких претензий к этому, потому что я думал, что использование интерфейса отладки делает то же самое с причудливой этикеткой. В прошлом году я проходил стажировку и однажды забыл удалить System.out.println(); в моем запросе на перенос. Он был отклонен при проверке кода, и мой наставник научил меня основам отладки. Для меня это был хороший опыт, хотя мне было трудно отказаться от своей вредной привычки. Теперь я полностью перестал писать System.out.println(); и много исследовал об отладке. Пришло время поделиться тем, что я узнал.

1. Установка точек останова

Самая важная часть отладки - это точки останова. Точка останова - это место, где вы хотите приостановить выполнение программы для целей отладки. Когда ваша программа где-то останавливается, вы можете увидеть многие свойства вашей текущей области видимости. Есть четыре типа точек останова.

1.1 Точка останова по строке

Это самый используемый из всех. Он приостанавливает вашу программу перед выполнением отмеченной строки. Просто нажмите на желоб рядом с номером строки, чтобы установить точку останова. Требуется только одно - строка должна быть исполняемой.

1.2 Точка останова метода

Вы можете приостановить программу, чтобы увидеть входящие и исходящие значения метода. Эта точка останова дважды приостанавливает выполнение программы. Щелкните желоб, в котором объявлен метод. Вы также можете щелкнуть объявление класса, чтобы установить точку останова для конструктора.

1.3. Поле наблюдения

Это используется для отслеживания всех взаимодействий в поле. Установите точку останова в объявлении поля. Ваша программа будет приостанавливаться каждый раз, когда вы взаимодействуете с этим полем.

1.4. Исключительная точка останова

Когда вы устанавливаете точку останова по исключению, ваша программа приостанавливается при возникновении исключения. Он глобален и не зависит от вашего исходного кода. Таким образом, вы не устанавливаете его с помощью щелчков по желобу, как предыдущие. Откройте окно Просмотр точек останова с помощью кнопки Ctrl + Shift + F8 или Просмотр точек останова в окне отладки. Вы можете выбрать Любое исключение в разделе Java Exception Breakpoints или добавить конкретное исключение с помощью значка + или Alt + Insert .

Вы можете добавить в это окно все типы точек останова. Но желоба для других удобнее.

1.5 Условная точка останова

Не нужно объяснять, он делает то, о чем говорит название. После установки точки останова щелкните значок правой кнопкой мыши, и вы увидите ввод основных условий. Вы можете написать условие, как будто вы пишете if условие. Он будет приостановлен, если условие вернет истинное значение.

IntelliJ предоставляет разные типы условий и фильтров, но я не буду их объяснять. См. Документы IntelliJ.

2. Окно отладки

2.1 Шаговые функции

Вы можете увидеть пошаговые функции выше. Эти кнопки взяты из окна отладки. Вы можете использовать Alt + 5, чтобы открыть окно Отладка, если оно не отображается. Давайте подробно рассмотрим эти пошаговые функции.

Переход: когда вы переходите строку, вы выполняете ее и делаете паузу перед выполнением следующей строки.

Шаг с заходом: если вы войдете в линию, есть два варианта. Если есть отладчик вызова функции, перейдите к этой функции и выполните ее шаг за шагом. В противном случае он будет вести себя как Step Over, поскольку не во что входить.

Force Step Into: в некоторых случаях отладчик игнорирует параметр step into и ведет себя как step over. Вы можете заставить его вмешаться вместе с ним. Например, отладчик игнорирует переход в String string = new String("Hello World!");, но если вы сделаете это принудительно, вы увидите реализацию String.

Выход: вы возвращаетесь туда, где вы вызывали текущую функцию. Чтобы продолжить приведенный выше пример, когда вы нажимаете Step Out внутри реализации String, вы возвращаетесь туда, где вы вызываете new String();.

Drop Frame: Он идет на шаг назад. Как я уже говорил ранее в этой статье, когда ваша программа в какой-то момент приостанавливается, вы видите текущий кадр стека. С ним вы переходите к предыдущему кадру стека. Но не путайте, вы не вернетесь во времени, вы просто сделаете шаг назад. Это не отменит вашу последнюю операцию.

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

2.2 Кнопки управления отладчиком

Это кнопки управления отладчиком, расположенные в самой левой части окна отладчика.

Повторить: он делает то, что говорит.

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

Приостановить программу: он приостанавливает выполнение программы, но не предоставляет вам всех функций, которые есть в точках останова.

Стоп: как вы могли догадаться, останавливает запущенную программу.

Просмотр точек останова. Откроется окно, в котором можно увидеть все установленные точки останова, установить / удалить точки останова и определить условия.

Отключить точки останова: все установленные точки останова будут отключены.

2.3 Трассировка переменных

Вы пишете метод или любой фрагмент кода и ожидаете, что он будет работать так, как вы планировали, но что-то идет не так. Если вы доверяете своему алгоритму, лучший вариант - отслеживать каждое изменение в вашем коде через фрейм стека. Просто установите точку останова и смотрите каждое изменение.

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

Вы видите переменную dateInput, и она анализируется как '2019-03-10'. Затем вы проверяете интерфейс и видите, что дата фактически отправляется как «дд-М-гггг», но анализируется как «М / дд / гггг». Так что проблема решается быстро. Это фиктивный пример, демонстрирующий основную цель отслеживания переменных. Сценарии из реальной жизни будут полезнее.

2.4 Оценка выражений и установка значений вручную

Это тоже хорошие особенности. Вы можете протестировать приостановленное приложение с другими значениями и продолжить проверку. Если вы посмотрите на переменную и спросите «что бы произошло, если бы она была…?», это означает, что вам нужна одна из этих функций. Evaluate Expression также предоставляет больше, чем просто установку значений.

Чтобы установить значение в основном, щелкните переменную правой кнопкой мыши, выберите Установить значение (F2) и введите новое значение.

Если вы хотите расширить возможности или оценить выражение Java, щелкните переменную правой кнопкой мыши и выберите Оценить выражение (Alt + F8). Вы можете запустить свое выражение в этом окне.

Подумайте о последнем фиктивном примере из раздела 2.3 Трассировка переменных. Вы хотели посмотреть, будет ли ваш метод работать правильно при изменении парсера. Измените дату перед логикой и посмотрите, что произойдет.

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

Мой единственный ресурс - это документы IntelliJ. Вы можете проверить это для получения дополнительной информации.