Stack trace java что это

Что такое stack trace, и как с его помощью находить ошибки при разработке приложений?

Иногда при запуске своего приложения я получаю подобную ошибку:

Мне сказали, что это называется «трассировкой стека» или «stack trace». Что такое трассировка? Какую полезную информацию об ошибке в разрабатываемой программе она содержит?

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

Stack trace java что это. dVTjR. Stack trace java что это фото. Stack trace java что это-dVTjR. картинка Stack trace java что это. картинка dVTjR

1 ответ 1

Простыми словами, трассировка стека – это список методов, которые были вызваны до момента, когда в приложении произошло исключение.

Простой случай

В указанном примере мы можем точно определить, когда именно произошло исключение. Рассмотрим трассировку стека:

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

Для отладки этого фрагмента открываем Book.java и смотрим, что находится на строке 16 :

Пример цепочки исключений

Иногда приложения перехватывают исключение и выбрасывают его в виде другого исключения. Обычно это выглядит так:

Трассировка в этом случае может иметь следующий вид:

В этом случае разница состоит в атрибуте «Caused by» («Чем вызвано»). Иногда исключения могут иметь несколько секций «Caused by». Обычно необходимо найти исходную причину, которой оказывается в самой последней (нижней) секции «Caused by» трассировки. В нашем случае, это:

Еще один пугающий пример с библиотечным кодом

Как правило, трассировка имеет гораздо более сложный вид, чем в рассмотренных выше случаях. Приведу пример (длинная трассировка, демонстрирующая несколько уровней цепочек исключений):

Однако все вызовы методов в данном случае относятся к библиотечному коду. Поэтому мы перейдем к предыдущей секции «Caused by» и найдем первый вызов метода из нашего кода, а именно:

Источник

Что такое трассировка стека и как я могу использовать ее для устранения ошибок приложения?

Иногда, когда я запускаю свое приложение, оно выдает мне ошибку, которая выглядит следующим образом:

Люди называют это «следом стека». Что такое трассировка стека? Что он может сказать мне об ошибке, которая происходит в моей программе?

Простой пример

С помощью примера, приведенного в вопросе, мы можем точно определить, где было выброшено исключение в приложении. Давайте посмотрим на трассировку стека:

Это будет означать, что что-то (вероятно title ) находится null в приведенном выше коде.

Пример с цепочкой исключений

Иногда приложения перехватывают исключение и повторно генерируют его как причину другого исключения. Это обычно выглядит так:

Это может дать вам трассировку стека, которая выглядит следующим образом:

То, что отличается от этого, это «Причины». Иногда исключения будут иметь несколько разделов «Причины». Для них обычно требуется найти «основную причину», которая будет одной из самых низких «причинных» секций в трассировке стека. В нашем случае это:

Более сложный пример с библиотечным кодом

Обычно трассировки стека намного сложнее, чем два приведенных выше примера. Вот пример (он длинный, но демонстрирует несколько уровней связанных исключений):

Однако все вызовы методов в соответствии с этим являются библиотечным кодом. Итак, мы перейдем к «Причины» над ним и поищем первый вызов метода, происходящий из нашего кода, а именно:

Я публикую этот ответ, поэтому самый верхний ответ (при сортировке по активности) не является просто ошибочным.

Что такое Stacktrace?

Что такое исключение?

Исключением является то, что среда выполнения использует, чтобы сообщить вам, что произошла ошибка. Популярные примеры: NullPointerException, IndexOutOfBoundsException или ArithmeticException. Каждый из них вызывается, когда вы пытаетесь сделать что-то, что невозможно. Например, исключение NullPointerException будет выдано при попытке разыменования объекта Null:

Как я должен иметь дело со стеками / исключениями?

Сначала выясните, что вызывает исключение. Попробуйте поискать название исключения, чтобы выяснить причину этого исключения. В большинстве случаев это будет вызвано неправильным кодом. В приведенных выше примерах все исключения вызваны неправильным кодом. Так что для примера NullPointerException вы можете убедиться, что a он никогда не будет нулевым в то время. Вы можете, например, инициализировать a или включить проверку, подобную этой:

Иногда вы не можете быть уверены, что не получите исключения. Например, если вы используете сетевое соединение в своей программе, вы не можете остановить компьютер от потери его интернет-соединения (например, вы не можете запретить пользователю отключать сетевое соединение компьютера). В этом случае сетевая библиотека, вероятно, выдаст исключение. Теперь вы должны поймать исключение и обработать его. Это означает, что в примере с сетевым подключением вы должны попытаться повторно открыть подключение или уведомить пользователя или что-то в этом роде. Кроме того, всякий раз, когда вы используете catch, всегда перехватываете только исключение, которое вы хотите перехватить, не используйте такие широкие операторы catch, как catch (Exception e) что бы поймать все исключения. Это очень важно, потому что в противном случае вы можете случайно поймать не то исключение и отреагировать неправильно.

Давайте используем небольшой пример, чтобы показать, почему вы не должны просто перехватывать все исключения:

TLDR

Если 1. невозможно, перехватите конкретное исключение и обработайте его.

Источник

Работаем со StackTrace или как узнать, кто вызвал код

Совсем недавно решил усовершенствовать свой логер, про который уже писал ранее. Возникла необходимость внутри метода логера узнать, какой класс и метод делают вызов. Выход нашелся очень быстро, и не пришлось писать кучу ненужного кода — Java для такого случая имеет встроенный механизм, который позволяет отследить весь стек вызовов. Давайте посмотрим, как это сделать. А делается это очень просто при помощи вот такой конструкции Thread.currentThread().getStackTrace(). Любой код в Java выполняется обязательно в каком-то потоке. При помощи Thread.currentThread() получаем ссылку на текущий поток. Затем при помощи getStackTrace() получаем весь стек вызовов или stack trace (если честно, не знаю, как правильнее всего сказать про него по-русски). В результате получаем мы массив StackTraceElement[]. Каждый StackTraceElement содержит информацию так нужную нам. Первое — это имя класса, из которого делался или делается вызов. Второе — это имя метода, из которого делается вызов. К примеру в своем логере использовал вот такой код:

При помощи метода getClassName получил полное имя класса, а при помощи getMethodName — имя метода. Надеюсь сделанное мною «открытие» будет полезно.

Share this:

Понравилось это:

Похожее

Filed under Core Java Tagged with StackTrace

12 Responses to Работаем со StackTrace или как узнать, кто вызвал код

Автору спасибо за полезную (и при этом — короткую и понятную) статью!

Источник

Stack trace

1. Получение стек-трейса

Stack trace java что это. original. Stack trace java что это фото. Stack trace java что это-original. картинка Stack trace java что это. картинка original

В языке программирования Java у программиста есть очень много способов получить информацию о том, что сейчас происходит в программе. И это не просто слова.

Например, программы на языке C++ после компиляции превращаются в один большой файл машинного кода и все, что во время выполнения доступно программисту, — это адрес куска памяти, который содержит машинный код, который сейчас выполняется. Не густо, скажем так.

В Java же, даже после компиляции, классы остаются классами, методы и переменные никуда не деваются, и у программиста есть много способов получить данные о том, что сейчас происходит в программе.

Стек-трейс

Можно записать ее и в две строки:

Код
Вывод на экран

Как мы видим по выводу на экран, в приведенном примере метод getStackTrace() вернул массив из трех элементов:

Из этого стек-трейса можно сделать вывод, что:

Кстати, на экране отобразилась только часть всей имеющийся информации. Все остальное можно получить прямо из объекта StackTraceElement

2. StackTraceElement

У объектов этого класса есть такие методы:

МетодОписание
Возвращает имя класса
Возвращает имя метода
Возвращает имя файла (в одном файле может быть много классов)
Возвращает номер строки в файле, в которой был вызов метода
Возвращает имя модуля (может быть null )
Возвращает версию модуля (может быть null )

С их помощью можно получить более полную информацию о текущем стеке вызовов:

КодВывод на экранПримечание
имя класса
имя метода
имя файла
номер строки
имя модуля
версия модуля

имя класса
имя метода
имя файла
номер строки
имя модуля
версия модуля

имя класса
имя метода
имя файла
номер строки
имя модуля
версия модуля

3. Стек

Что такое Stack Trace вы уже знаете, а что же такое сам Stack (Стек)?

Стек — это структура хранения данных, в которую можно добавлять элементы и из которой можно забирать элементы. Причем брать элементы можно только с конца: сначала последний добавленный, потом — предпоследний, и т.д.

Само название Stack переводится с английского как «стопка» и очень похоже на стопку бумаги. Если вы положите на стопку бумаги листы 1, 2 и 3, взять вы их сможете только в обратном порядке: сначала третий, затем второй, а только затем первый.

МетодыОписание
Добавляет элемент obj в конец списка (наверх стопки)
Забирает элемент с верха стопки (высота стопки уменьшается)
Возвращает элемент с верха стопки (стопка не меняется)
Проверяет, не пуста ли коллекция
Ищет объект из коллекции, возвращает его index
КодСодержимое стека (вершина справа)

Стек используется в программировании довольно часто. Так что это полезная коллекция.

Источник

StackTrace

Stack trace java что это. 1024. Stack trace java что это фото. Stack trace java что это-1024. картинка Stack trace java что это. картинка 1024

— Привет! Сегодня я расскажу тебе, что такое стек-трейс. Но сначала расскажу, что такое стек.

— Представь себе стопку бумаг — деловых поручений для некоторого исполнителя. Сверху на стопку можно класть новое задание, и с верха стопки задание можно брать. При таком подходе задания будут исполняться не по порядку поступления. Задание, положенное самым последним, будет взято исполнителем самым первым. Такая структура элементов коллекции называется стеком – стопкой.

— В Java для этого есть специальная коллекция – Stack. Это коллекция, у которой есть методы «добавить элемент» и «взять(достать/забрать) элемент». Как ты уже догадался, первым будет взят элемент, добавленный самым последним.

— Хм. Вроде не сложно и понятно.

— Отлично. Тогда сейчас объясню, что такое стек-трейс.

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

— Ну, некоторая аналогия есть, но не уверен, что я все понял правильно.

— Смотри. Стек – это набор элементов. Как листы в стопке. Чтобы взять третий сверху лист, надо сначала взять второй, а для этого взять первый. Класть и брать листы можно всегда, но всегда взять можно только самый верхний.

— Подожди. Если я все правильно понял, то весь этот стек сведется к «взять можно только самый последний положенный лист», «выйти можно только из последней функции, в которую зашли». Так?

— Да. Так вот – последовательность вызовов функций — это и есть «стек вызовов функций», он же просто «стек вызовов». Функция, вызванная последней, должна завершиться самой первой. Давай посмотрим это на примере:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *