При написании кода он, порой, не работает так, как я задумал или не работает в принципе. Я сижу и гадаю: что и где не так?
Немного посмотрев на код - иду на ресурсы профессионалов, например Stack Overflow и публикую вопрос "Где здесь ошибка?" или "Почему не работает?"
В итоге очень часто проблема мелкая: дурацкая опечатка, ошибка в синтаксисе и подобное. Профессионалом так не стать, если по каждой мелочёвке бегать по ресурсам. А я хочу им быть.
Вопрос: какие есть способы, чтобы найти ошибки в Java коде? Какие есть инструменты, методы, пути и пр.?
Ответы
Ответ 1
Вчера всё работало, а сегодня не работает / Код не работает как задумано
или
Debugging (Отладка)
В чем заключается процесс отладки? Что это такое?
Процесс отладки состоит в том, что мы останавливаем выполнения скрипта в любом месте
смотрим, что находится в переменных, в функциях, анализируем и переходим в другие места; ищем те места, где поведение отклоняется от правильного.
Заметка: Отладка производится как правило в IDE (Интегрированная среда разработки). Что это такое можно чуть подробнее ознакомиться в вопросе
Какие есть способы предупреждения ошибок, их нахождения и устранения?
В данном случае будет рассмотрен пример с Intellij IDEA, но отладить код можно
в любой другой IDE.
Подготовка
Достаточно иметь в наличии IDE, например Intellij IDEA
Запуск
Для начала в левой части панели с кодом на любой строке можно кликнуть ЛКМ, тем самы
поставив точку останова (breakpoint - брейкпойнт). Это то место, где отладчик автоматически остановит выполнение Java, как только до него дойдёт. Количество breakpoint'ов не ограничено. Можно ставить везде и много.
Отладка запускается сочетанием Shift+F9 или выбором в верхнем меню Run → Debug или нажатием зеленого "жучка":
В данном случае, т.к. функция вызывается сразу на той же странице, то при нажати
кнопки Debug — отладчик моментально вызовет метод, выполнение "заморозится" на перво
же брейкпойнте. В ином случае, для активации требуется исполнить действие, при котором произойдет исполнение нужного участка кода (клик на кнопку в UI, передача POST запроса с данными и прочие другие действия)
Цифрами обозначены:
Стэк вызовов, все вложенные вызовы, которые привели к текущему месту кода.
Переменные. На текущий момент строки ниже номера 24 ещё не выполнилась, поэтому определена лишь data и numsStringArr
Показывает текущие значения любых переменных и выражений. В любой момент здесь можн
нажать на +, вписать имя любой переменной и посмотреть её значение в реальном времени
Например data или nums[0], а можно и nums[i] и item.test.data.name[5].info[key[1]] и т.д. На текущий момент строки ниже номера 24 ещё не выполнилась, поэтому sum и output во вкладке Watchers обозначены красным цветом с надписью "cannot find local variable".
Процесс
Для самого процесса используются элементы управления (см. изображение выше, выделен
зеленым прямоугольником) и немного из дополнительно (см. изображение выше, выделено оранжевым прямоугольником)
Show Execution Point (Alt+F10) — переносит в файл и текущую линию отлаживаемого скрипта
Например если файлов много, решили посмотреть что в других вкладках, а потом забыли где у вас отладка :)
Step Over (F8) — делает один шаг не заходя внутрь функции. Т.е. если на текущей лини
есть какая-то функция, а не просто переменная со значением, то при клике данной кнопки, отладчик не будет заходить внутрь неё.
Step Into (F7) — делает шаг. Но в отличие от предыдущей, если есть вложенный вызов (например функция), то заходит внутрь неё.
Step Out (Shift+F8) — выполняет команды до завершения текущей функции. Удобна, есл
случайно вошли во вложенный вызов и нужно быстро из него выйти, не завершая при этом отладку.
Rerun (Ctrl+F5) — Перезапустить отладку
Resume Program(F9) — Продолжает выполнения скрипта с текущего момента. Если больш
нет других точек останова, то отладка заканчивается и скрипт продолжает работу. В ином случае работа прерывается на следующей точке останова.
Stop (Ctrl+F2) — Завершить отладку
View Breakpoints (Ctrl+Shift+F8) — Посмотреть все установленные брейкпойнты
Mute Breakpoints — Отключить брейкпойнты.
...
Итак, в текущем коде видно значение входного параметра:
data = "23 24 11 18" — строка с данными через пробел
numsStringArr = {"23", "24", "11", "18"} — массив строк, который получился из входной переменной.
Если нажмем F8 2 раза, то окажемся на строке 27; во вкладках Watches и Variable
и в самой странице с кодом увидим, что переменная sum была инициализирована и значение равно 0, а также nums инициализирована и в ней лежит массив целых чисел {23, 24, 11, 18} .
Если теперь нажмем F8, то попадем внутрь цикла for и нажимая теперь F8 пока не окончитс
цикл, можно будет наблюдать на каждой итерации, как значение num и sum постоянно изменяются. Тем самым мы можем проследить шаг за шагом весь процесс изменения любых переменных и значений на любом этапе, который интересует.
Дальнейшие нажатия F8 переместит линию кода на строки 31, 32 и, наконец, 36.
Дополнительно
Если нажать на View Breakpoints в левой панели, то можно не только посмотреть вс
брейкпойнты, но в появившемся окно можно еще более тонко настроить условие, при котором на данной отметке надо остановиться. В методе выше, например, нужно остановиться только когда sum превысит значение 20.
Это удобно, если останов нужен только при определённом значении, а не всегда (особенно в случае с циклами).
Больше информации об отладке можно посмотреть в http://learn.javajoy.net/debug-intellij-idea, а также в официальной документации к IDE
Ответ 2
Алексей всё правильно написал, но по доброте своей допустил некоторое упрощение
которое я сейчас постараюсь исправить.
IDE не обязательна как для разработки, так и для отладки!
(Можете быть уверены, в этом месте я зловеще захохотал)
Исходный код можно писать в любом текстовом редакторе, а компиляцию и отладку можн
осуществлять консольными утилитами JDK. Для большей ̶ ̶г̶р̶о̶т̶е̶с̶к̶н̶о̶с̶т̶и̶ восхитительности происходящего будем считать, что работа осуществляется под управлением Windows 7 x64.
Прежде всего, для удобства использования инструментов JDK, добавим их в переменну
окружения PATH. А чтобы в полной мере пройти тропой древних, исходный текст будем писать не выходя из консоли. Запускаем командную строку cmd, набираем copy con App.java, вводим код и нажимаем Ctrl+Z
Для компиляции вводим команду javac -g App.java. Ключ -g нужен для включения отладочной информации в class-файл.
И наконец запускаем отладчик командой jdb App
Как видно на скриншоте, первым делом я установил точку останова на метод main командо
stop on App.main и запустил выполнение командой run. Отладчик, в соответствии с точкой останова, остановил выполнение на 8-й строке программы и показал её.
Аналогично командам доступным в IDE можно:
Посмотреть текущую позицию отладки командой list
Выполнить следующую строку командой step
"Перешагнуть" вызов метода командой next
"Шагнуть" из метода командой step up
Вернуться к выполнению программы командой cont
Вывести список локальный переменных командой locals или вывести значение какой-либо конкретной переменной командой print <имя переменной>
Самая полезная команда - это help или ?, позволяющая получить справку по всем командам. И конечно же команда без которой не обойтись - quit.
Комментариев нет:
Отправить комментарий