Перейти к содержимому

E printstacktrace java что это

  • автор:

В чём разница между printStackTrace () и System.out.println(exception.getMessage())?

Предположим, я обрабатываю исключение и в блоке catch просто вывожу сообщение об ошибке. Я могу это сделать так:

try < //Какой-то код >catch(IOException exception)

Но могу сделать и так:

try < //Какой-то код >catch(IOException exception)

В чём разница этих двух способов? И какой лучше использовать?
Отслеживать
задан 13 янв 2023 в 4:27
2,326 2 2 золотых знака 11 11 серебряных знаков 38 38 бронзовых знаков

Я могу ошибаться, но System выведет сообщение в системную консоль, а exception выдет в системный логгер (который может быть системной консолью)

13 янв 2023 в 7:16
сообщение об ошибке и «стектрейс» разные вещи
13 янв 2023 в 11:41

Учтите, что getMessage() имеет право и null вернуть. Вывод null в качестве диагностики — это не самый лучший вариант для отладки.

13 янв 2023 в 14:20
@BccHnw То есть если нужно просто вывести сообщение об ошибке, то метод printStackTrace() лучше?
14 янв 2023 в 8:39

printStackTrace выводит сразу три вещи: название класса исключения, сообщение ( message , если оно есть, т.е. не равно null ) и stack trace. Это более громоздко, но именно для диагностики лучше

15 янв 2023 в 9:06

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Имхо — и то и другое неправильно. Ошибки надо логировать, а не выкидывать в консоль.

Так же плохо System.out , так как для вывода ошибок есть System.err .

printStackTrace как раз и выводит стек ошибки в стандартный системный поток для ошибок. Т.е. System.err

Отслеживать
ответ дан 13 янв 2023 в 7:26
Sergey Mitrofanov Sergey Mitrofanov
2,428 1 1 золотой знак 10 10 серебряных знаков 20 20 бронзовых знаков

Собрал ответ из всех комментариев под вопросом: по кусочку информации из того, из этого и наконец понял, в чём разница.

Возьмём вот такой код:

import java.io.File; import java.io.PrintWriter; import java.io.IOException; public class Test < public static void main(String args[]) < File file = new File("C:" + File.separator + "someFile.txt"); try(PrintWriter writer = new PrintWriter(file))< writer.println("something. "); >catch (IOException e) < //Здесь будем выводить сообщение об ошибке >> > 
  1. printStackTrace() . В блоке catch пропишем:
> catch (IOException e)

В случае, если исключение произойдёт, то на экран будет выведен стектрейс + сообщение об ошибке:

java.io.FileNotFoundException: C:/someFile.txt (No such file or directory) at java.base/java.io.FileOutputStream.open0(Native Method) at java.base/java.io.FileOutputStream.open(FileOutputStream.java:293) at java.base/java.io.FileOutputStream.(FileOutputStream.java:235) at java.base/java.io.FileOutputStream.(FileOutputStream.java:184) at java.base/java.io.PrintWriter.(PrintWriter.java:309) at Test.main(Test.java:9) 

И сообщение об ошибке, и стектрейс. Два в одном.

  1. System.err.println(e.getMessage()) . Если прописать в блоке catch это:
> catch (IOException e)

То на экран будет выведено только сообщение об ошибке, без стектрейса (то есть без списка методов, кто кого вызвал):

C:/someFile.txt (No such file or directory) 

Вывод

Исключения нужно конечно нормально обрабатывать, но если всё-таки по какой-то причине вы хотите вывести информацию об исключении в консоль, то пишите e.printStackTrace() , ведь это выводит более полную информацию, чем System.err.println(e.getMessage()) .

Спасибо всем, кто писал в комментариях или отвечал!

Конвертация Stack Trace в строку в Java

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

Допустим, у нас есть следующий код:

try < // Код, который может вызвать исключение >catch (Exception e)

Вызов метода printStackTrace() напишет stack trace в стандартный поток ошибок. Однако, что если мы хотим записать этот stack trace в строку, чтобы использовать его где-то еще?

Методы преобразования Stack Trace в строку

Существуют несколько способов преобразовать Stack Trace в строку в Java.

С использованием StringWriter и PrintWriter

Один из способов — использовать классы StringWriter и PrintWriter из стандартной библиотеки Java. Вот как это делается:

StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); String stackTrace = sw.toString();

В этом коде StringWriter создает буфер, в который можно записывать символы. PrintWriter принимает StringWriter в качестве аргумента и направляет вывод в этот StringWriter . Затем printStackTrace(PrintWriter s) пишет stack trace в PrintWriter , который в свою очередь записывает его в StringWriter . Содержимое StringWriter затем можно получить в виде строки.

С использованием Apache Commons Lang

Если в проекте используется библиотека Apache Commons Lang, то можно использовать утилиту ExceptionUtils для преобразования Stack Trace в строку:

String stackTrace = ExceptionUtils.getStackTrace(e);

Здесь getStackTrace(Throwable throwable) — это статический метод, который возвращает полный stack trace для переданного исключения.

Заключение

Как видно, преобразование Stack Trace в строку в Java — это простая задача, которую можно выполнить несколькими способами. Выбор метода зависит от требований проекта и доступных библиотек.

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

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

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

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

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

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 )

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

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

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 , поэтому она доступна для десериализованных объектов.

Каково использование метода printStackTrace() в Java?

Я просматриваю программу сокета. В нем printStackTrace вызывается в объекте IOException в блоке catch.
Что делает printStackTrace() на самом деле?

catch(IOException ioe)

Я не знаю его цели. Для чего его используют?

ОТВЕТЫ

Ответ 1

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

Ответ 2

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

 try < throw new NullPointerException(); >catch (NullPointerException e) < System.out.println(e); >try < throw new IOException(); >catch (IOException e) < e.printStackTrace(); >System.exit(0); 

println(e):

e.printStackTrace:

java.io.IOException at package.Test.main(Test.java:74) 
Ответ 3

Он помогает отслеживать исключение. Например, вы пишете несколько методов в своей программе, и один из ваших методов вызывает ошибку. Затем printstack поможет вам определить, какой метод вызывает ошибку. Стек поможет примерно так:

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

Ответ 4

printStackTrace() помогает программисту понять, где возникла настоящая проблема. printStacktrace() — это метод класса Throwable пакета java.lang. Он печатает несколько строк в выходной консоли. Первая строка состоит из нескольких строк. Он содержит имя подкласса Throwable и информацию о пакете. Со второй строки он описывает номер ошибки/номер строки, начинающийся с » на«.

В последней строке всегда указывается назначение, на которое влияет ошибка/исключение. Вторая последняя строка сообщает нам о следующей строке в стеке, где элемент управления идет после получения перевода из номера строки, указанного в последней строке. Ошибки/исключения представляют собой вывод в виде стека, который был загружен в стек методом fillInStackTrace() класса Throwable, который сам заполняет передачу управления программой детали в стек выполнения. Строки, начинающиеся с в, представляют собой ничего, кроме значений стека выполнения. Таким образом, программист может понять, где в коде актуальная проблема.

Наряду с методом printStackTrace() рекомендуется использовать e.getmessage().

Ответ 5

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

Вы должны учитывать метод Logger.getLogger(), он предлагает лучший способ обработки исключений (logging), и, кроме того, printStackTrace() без аргументов считается устаревшим и должен ТОЛЬКО использоваться для целей отладки, а не для пользователя дисплей.

Ответ 6

printStackTrace() помогает программисту понять, где возникла настоящая проблема. Метод printStackTrace() является членом класса Throwable в пакете java.lang .

Ответ 7

Что такое метод e.printStackTrace() в Java?

Ну, цель использования этого метода e.printStackTrace(); заключается в том, чтобы увидеть, что именно неправильно.

Например, мы хотим обработать исключение. Давайте рассмотрим следующий пример.

public class Main < public static void main(String[] args) < int a = 12; int b = 2; try < int result = a / (b - 2); System.out.println(result); >catch (Exception e) < System.out.println("Error: " + e.getMessage()); e.printStackTrace(); >> > 

Я использовал метод e.printStackTrace(); , чтобы точно показать, что не так.

На выходе мы можем видеть следующий результат.

Error: / by zero java.lang.ArithmeticException: / by zero at Main.main(Main.java:10) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Ответ 8

printStackTrace — метод класса Throwable . этот метод отображает сообщение об ошибке на консоли, где мы получаем исключение в исходном коде. Эти методы могут использоваться с блоком catch и описывать:

  • Название исключения.
  • Описание исключения.
  • Где мы получаем исключение.

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

  • printStackTrace()
  • toString()
  • getMessage()
public class BabluGope < public static void main(String[] args) < try < System.out.println(10/0); >catch (ArithmeticException e) < e.printStackTrace(); // System.err.println(e.toString()); //System.err.println(e.getMessage()); >> > 

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

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