Что такое использование метода printStackTrace() в Java?
Я прохожу через программу для сокетов. В ней вызывается printStackTrace на объекте IOException в блоке catch.
Что на самом деле делает printStackTrace() ?
catch(IOException ioe)
Я не знаю о его назначении. Для чего он используется? java exception printstacktrace
Поделиться Источник 01 апреля 2010 в 12:46
9 ответов
Это метод на экземплярах Exception , который печатает стековый след экземпляра на System.err . Это очень простой, но очень полезный инструмент для диагностики исключений. Он сообщает вам, что произошло и где в коде это произошло. Вот пример того, как это может быть использовано на практике:
try < // . >catch (SomeException e)
Обратите внимание, что в «серьезном производственном коде» вы обычно не хотите делать это по различным причинам (например, System.out менее полезен и не является потокобезопасным). В таких случаях вы обычно используете некоторый фреймворк журнала, который предоставляет тот же (или очень похожий) вывод с помощью команды, такой как log.error(«Ошибка при фребинировании», e); .
Поделиться 01 апреля 2010 в 12:47
Мне тоже было интересно это сделать, поэтому я просто собрал небольшой пример кода, где вы можете увидеть, что он делает:
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) :
java.lang.NullPointerException
Вызов e.printStackTrace() :
java.io.IOException at package.Test.main(Test.java:74)
Поделиться 14 февраля 2014 в 19:43
Это помогает отслеживать исключение. Например, вы пишете некоторые методы в своей программе и один из ваших методов вызывает ошибку. Тогда printstack поможет вам определить, какой метод вызывает ошибку. Stack поможет вам так: Сначала ваш основной метод будет вызван и вставлен в stack, затем второй метод будет вызван и вставлен в stack в порядке LIFO, и если какая-то ошибка возникает где-то внутри какого-либо метода, то этот стек поможет определить этот метод.
Поделиться 23 апреля 2012 в 11:24
printStackTrace() помогает программисту понять, где возникла фактическая проблема. printStacktrace() — это метод класса Throwable пакета java.lang . Он печатает несколько строк в консоли вывода. Первая строка состоит из нескольких строк. Она содержит имя подкласса Throwable и информацию о пакете. Начиная со второй строки, она описывает позицию ошибки/номер строки, начинающийся с at . Последняя строка всегда описывает назначение, затронутое ошибкой/исключением. Вторая последняя строка сообщает нам о следующей строке в стеке, где элемент управления переходит после переноса из номера строки, описанного в последней строке. Ошибки/исключения представляют собой вывод в виде стека, который был вписан в стек методом fillInStackTrace() класса Throwable , который сам заполняет данные о переносе элементов управления программой в стек выполнения. Строки, начинающиеся с at , являются ничем иным, как значениями стека выполнения. Таким образом, программист может понять, где в коде фактическая проблема. Вместе с методом printStackTrace() хорошая идея использовать e.getmessage() . .
Поделиться 01 августа 2015 в 16:42
printStackTrace() печатает места, где произошло исключение в исходном коде, позволяя автору, который написал программу, увидеть, что пошло не так. Но так как оно показывает проблемы в исходном коде, пользователи, которые могут или не могут иметь опыта кодирования, могут не понять, что пошло не так, поэтому если программа позволяет пользователю отправлять сообщения об ошибках авторам, пользователи могут не иметь возможности дать хорошие данные о том, что пошло не так. Вам следует рассмотреть метод Logger.getLogger() , он предлагает лучший способ обработки исключений (логирования), и кроме того, printStackTrace() без аргументов считается устаревшим и должен использоваться ТОЛЬКО для целей отладки, а не для отображения пользователя.
Поделиться 28 мая 2015 в 03:10
- Название исключения.
- Описание исключения.
- Местоположение исключения в исходном коде.
Три метода, которые описывают исключение в консоли (в которых 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()); >> >
Поделиться 12 июля 2017 в 20:47
Метод printStackTrace() помогает программисту понять, где возникла фактическая проблема. Метод printStackTrace() является членом класса Throwable в пакете java.lang .
Поделиться 30 июня 2017 в 18:25
printStackTrace() помогает программисту понять, где возникла фактическая проблема. Он помогает отслеживать исключение. Это метод printStackTrace() класса Throwable, унаследованный каждым классом исключения. Этот метод печатает то же сообщение об объекте e, а также номер строки, где произошло исключение.
Ниже приведен еще один пример стека печати исключения в Java.
public class Demo < public static void main(String[] args) < try < ExceptionFunc(); >catch(Throwable e) < e.printStackTrace(); >> public static void ExceptionFunc() throws Throwable < Throwable t = new Throwable("This is new Exception in Java. "); StackTraceElement[] trace = new StackTraceElement[] < new StackTraceElement("ClassName","methodName","fileName",5) >; t.setStackTrace(trace); throw t; > >
java.lang.Throwable: Это новое исключение в Java. at ClassName.methodName(fileName:5)
Поделиться 25 октября 2018 в 14:29
Что такое использование метода 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)
В чём разница между 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 серебряных знаков 39 39 бронзовых знаков
Я могу ошибаться, но 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()) .
Спасибо всем, кто писал в комментариях или отвечал!
Использование e.printStackTrace() в Java
Это, вероятно, вопрос для новичка, но надеюсь, вы сможете мне помочь. 🙂 У меня есть что-то вроде этого:
try < //try to do something there >catch (IOException e) < //handle the exception e.printStackTrace(); >
Я использую среду разработки NetBeans, и по какой-то причине printStackTrace подчеркивается в строке. Когда я нажимаю Alt+Enter, он говорит, что Throwable.printStackTrace() должен быть удален. Что это означает? Может кто-то дать больше информации о том, что это может означать? Или я могу это игнорировать? Спасибо! java ioexception printstacktrace
Поделиться Источник 18 августа 2011 в 00:03
5 ответов
Попробуйте:
e.printStackTrace(System.out);
Поделиться 18 августа 2011 в 00:06
Это просто рекомендация. В Eclipse это нормально — я считаю, что это только IDE говорит вам, что есть более обычные методы для этого, как и некоторые другие ответы. Я нахожу, что это полезно для отладки, и что вы должны сообщить пользователям, когда будет возникать фатальная ошибка, использовать режим отладки (например, консольный переключатель -d) для сбора этих журналов.
Поделиться 18 августа 2011 в 00:16
Возможно, это происходит потому, что printStackTrace() на самом деле не обрабатывает ошибку так сильно, как просто загружает стек в консоль. Он действует как заполнитель, пока вы не замените его правильным обращением с ошибками (если он вообще нужен) и замените вывод на какой-то логгер.
Поделиться 18 августа 2011 в 00:08
e.printStackTrace();
Не является хорошей практикой, потому что она печатает в стандартном ErrorStream, который в большинстве случаев является консолью! NetBeans должен предупреждать вас об этом. Хорошая практика заключается в регистрации сообщения. Следуйте той же ссылке: http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html РЕДАКТИРОВАТЬ См. первый комментарий ниже для получения дополнительной информации.
Поделиться 18 августа 2011 в 00:08
Просто печатать стековый след недостаточно. Печать стекового следа исключения само по себе не означает, что это совсем плохая практика, но печатать только стековый след, когда возникает исключение, является проблемой. Всегда регистрируйте исключения (с помощью хорошего фреймворка для ведения журнала), но не раскрывайте их конечному пользователю. И убедитесь, что показ стекового следа происходит только в режиме разработки. Я сам использую (в большинстве случаев) logger.log(Level.SEVERE, .getMessage(), ); . когда netbeans предлагает вам обрабатывать исключение ‘ Окружное заявление с try-catch ‘, если вы нажмете на это, оно сгенерирует):
try < //something need to be handle(exception that throw) >catch (SQLException ex)
- Лучшие практики для обработки исключений
- Javarevisited- ведение журнала .
- Какие есть последние варианты в Java фреймворках журналов?
- Сравнительные параметры 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 , поэтому она доступна для десериализованных объектов.