В чём разница между 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) < //Здесь будем выводить сообщение об ошибке >> >
- 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)
И сообщение об ошибке, и стектрейс. Два в одном.
- 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()); >> >