Главная > Java сниппеты > Элементы трассировки стека

Тема Зацепин
268

Java-разработчик 🧩
235
1 минуту

Элементы трассировки стека

1 Введение 2 Пример работы стека 3 Исключительная ситуация: ссылка имеет значение null 4 Исключительная ситуация генерируется во время инициализации экземпляра 5 Ссылки

Добавлено : 19 Mar 2009, 17:33

Содержание

Введение

Стандартная библиотека Java имеет механизм для отображения трассировки стека, использующий метод Throwable.printStackTrace. Этот метод используется для создания дампа контекста программы для не перехваченных исключительных ситуаций. Информация о трассировке выводится в поток System.err или в указанный PrintStream или PrintWriter.

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

Пример работы стека

Новые возможности библиотеки предоставляют вам возможность программного доступа к трассировке стека. Вы можете извлечь массив объектов StackTraceElement, каждый объект представляет единичный фрейм стека в трассировочной информации. Рассмотрим пример, чтобы понять, как это работает:

class A {
B bref;

void f() {
bref.g();
}
}

class B {
void g() {
}
}

class C {
String str;
int len = str.length();
}

public class TraceDemo1 {

// создать дамп единичного элемента трассировки стека

static void dumpTraceElement(StackTraceElement ste) {
System.err.println("filename = " + ste.getFileName());
System.err.println
("line number = " + ste.getLineNumber());
System.err.println
("class name = " + ste.getClassName());
System.err.println
("method name = " + ste.getMethodName());
System.err.println
("is native method = " + ste.isNativeMethod());
}

// создать дамп массива элементов трассировки стека,
// сначала самые последние по времени

static void dumpTrace(Throwable e) {

// отобразить исключительную ситуацию

System.err.println("Exception: " + e);
System.err.println
();

// отобразить трассировку

StackTraceElement ste[] = e.getStackTrace();
for (int i = 0; i < ste.length; i++) {
dumpTraceElement(ste[i]);
System.err.println
();
}
}

public static void main(String args[]) {

// вызвать A.f() и инициировать исключительную ситуацию

try {
A aref = new A();
aref.f
();
} catch (Throwable e) {

// отобразить типовую трассировку стека

e.printStackTrace();
System.err.println
();

// создать дамп трассировки стека в пользовательском формате

dumpTrace(e);
}

System.err.println();
System.err.println
("==============================");
System.err.println
();

// вызвать исключительную ситуацию при инициализации

try {
new C();
} catch (Throwable e) {
dumpTrace(e);
}
}
}

Исключительная ситуация: ссылка имеет значение null

В этом примере программа TraceDemo1 сначала вызывает метод A.f. Этот метод, в свою очередь, вызывает B.g. К сожалению, при вызове B.g ссылка на объект B имеет значение null. Это вызывает исключительную ситуацию.

Сначала программа отображает типовую трассировку стека, которая выглядит примерно так:

java.lang.NullPointerException
at A.f
(TraceDemo1.java:5)
at TraceDemo1.main(TraceDemo1.java:61)

Затем отображается пользовательскую трассировку стека - с названием исключительной ситуации и последовательностью элементов StackTraceElements:

Exception: java.lang.NullPointerException filename = TraceDemo1.java line number = 5 class name = A method name = f is native method = false filename = TraceDemo1.java line number = 61 class name = TraceDemo1 method name = main is native method = false

Обратите внимание, что имя файла, имя класса и имя метода первого StackTraceElement ссылается на исключительную ситуацию. Исключительная ситуация происходит в строке 5 программы TraceDemo1.java внутри метода A.f.

Исключительная ситуация генерируется во время инициализации экземпляра

Вторая часть примера показывает, что происходит, когда исключительная ситуация генерируется во время инициализации экземпляра. В этом примере программа TraceDemo1 создает объект C. При создании экземпляра объекта C делается попытка получить длину строки str. Однако, поскольку str никогда явно не инициализировалась, ссылка на нее равна null. Вот результат работы этой части программы:

Exception: java.lang.NullPointerException filename = TraceDemo1.java line number = 15 class name = C method name =  is native method = false filename = TraceDemo1.java line number = 83 class name = TraceDemo1 method name = main is native method = false

Точка входа в исключительную ситуацию расположена в строке 15 программы TraceDemo1.java в классе C в методе с именем , являющимся специальным именем для методов инициализации экземпляров в виртуальной машине Java.

Вы можете использовать способность StackTraceElement реализовывать форматированные отчеты об исключительных ситуациях и собственные форматы журналов. Примером пользовательского формата ведения журнала является формат, ограничивающий трассировку стека до разумной глубины. Например, если есть 500 фреймов стека, вы, возможно, захотите сохранить первые десять и последние десять. Информация StackTraceElement является частью сериализованного представления экземпляров класса Throwable, поэтому она доступна для десериализованных объектов.

Ссылки

Дополнительная информация об элементах трассировки стека находится в описании класса StackTraceElement на странице http://java.sun.com/j2se/1.4/docs/api/java/lang/StackTraceElement.html.

Также обратитесь к разделу 10.12 "Потоки и исключительные ситуации" в учебнике "Язык программирования Java(tm), третье издание" Arnold, Gosling и Holmes http://java.sun.com/docs/books/javaprog/thirdedition/.

Теги: стек

Еще от автора

Применение WeakHashmap для списков слушателей

В статье от 11мая 1999 года Reference Objects были описаны основные идеи применения ссылочных объектов, но не приводилось детального описания. Данная статья позволит вам получить больше сведений, касающихся данной темы. В основном ссылочные объекты применяются для косвенных ссылок на память необходимую объектам. Ссылочные объекты хранятся в очереди (класс ReferenceQueue), в которой отслеживается доступность ссылочных объектов. Исходя из типа ссылочного объекта, сборщик мусора может освобождать память даже тогда, когда обычные ссылки не могут быть освобождены.

Заставки в Mustang

Согласно определению, данному в Wikipedia, заставка - это компьютерный термин, обозначающий рисунок, появляющийся во время загрузки программы или операционной системы. Заставка для пользователя является визуальным отображением инициализации программы. До выхода версии Java SE 6 (кодовое название Mustang) единственной возможностью применения заставки было создание окна, во время запуска метода main, и размещение в нем картинки. Хотя данный способ и работал, но он требовал полной инициализации исполняемой Java среды до появления окна заставки. При инициализации загружались библиотеки AWT и Swing, таким образом, появление заставки задерживалось. В Mustang появился новый аргумент командной строки, значительно облегчающий использование заставок. Этот способ позволяет выводить заставку значительно быстрее до запуска исполняемой Java среды. Окончательное добавление данной функциональности находится на рассмотрении в JCP.

Совмещение изображений

1 Введение 2 Правила визуализации и пример 3 Совмещение изображений в оперативной памяти 4 Постепенное исчезновение изображения 5 Ссылки и дополнительная информация

Еще по теме

Применение WeakHashmap для списков слушателей

В статье от 11мая 1999 года Reference Objects были описаны основные идеи применения ссылочных объектов, но не приводилось детального описания. Данная статья позволит вам получить больше сведений, касающихся данной темы. В основном ссылочные объекты применяются для косвенных ссылок на память необходимую объектам. Ссылочные объекты хранятся в очереди (класс ReferenceQueue), в которой отслеживается доступность ссылочных объектов. Исходя из типа ссылочного объекта, сборщик мусора может освобождать память даже тогда, когда обычные ссылки не могут быть освобождены.

Заставки в Mustang

Согласно определению, данному в Wikipedia, заставка - это компьютерный термин, обозначающий рисунок, появляющийся во время загрузки программы или операционной системы. Заставка для пользователя является визуальным отображением инициализации программы. До выхода версии Java SE 6 (кодовое название Mustang) единственной возможностью применения заставки было создание окна, во время запуска метода main, и размещение в нем картинки. Хотя данный способ и работал, но он требовал полной инициализации исполняемой Java среды до появления окна заставки. При инициализации загружались библиотеки AWT и Swing, таким образом, появление заставки задерживалось. В Mustang появился новый аргумент командной строки, значительно облегчающий использование заставок. Этот способ позволяет выводить заставку значительно быстрее до запуска исполняемой Java среды. Окончательное добавление данной функциональности находится на рассмотрении в JCP.

Использование потоков

1 Введение 2 Работа с выражениями типа Boolean 3 Класс JoptionPane 4 Приложение-счетчик 5 Ссылки

Перехват необрабатываемых исключений

В статье от 16 марта 2004 года Best Practices in Exception Handling были описаны приемы обработки исключений. В данной статье вы изучите новый способ обработки исключений при помощи класса UncaughtExceptionHandler добавленного в J2SE 5.0.

Использование класса LinkedHashMap

1 Введение 2 Сортировка хэш-таблицы 3 Копирование таблицы 4 Сохранение порядка доступа к элементам 5 Ссылки

Сказ про кодировки и java

С кодировками в java плохо. Т.е., наоборот, все идеально хорошо: внутреннее представление строк – Utf16-BE (и поддержка Unicode была с самых первых дней). Все возможные функции умеют преобразовывать строку из маленького регистра в большой, проверять является ли данный символ буквой или цифрой, выполнять поиск в строке (в том числе с регулярными выражениями) и прочее и прочее. Для этих операций не нужно использовать какие-то посторонние библиотеки вроде привычных для php mbstring или iconv. Как говорится, поддержка многоязычных тестов “есть в коробке”. Так откуда берутся проблемы? Проблемы возникают, как только строки текста пытаются “выбраться” из jvm (операции вывода текста различным потребителям) или наоборот пытаются в эту самую jvm “залезть” (операция чтения данных от некоторого поставщика).