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


98

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

catch(IOException ioe)
{
    ioe.printStackTrace();
}

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


47
Одной из наиболее мощных функций современных IDE является возможность поиска документации (называемой javadoc) для данного метода Java. В Eclipse это Shift-F2, когда курсор помещается на имя метода printStackTrace.
Торбьорн Равн Андерсен

2
Похоже, вы новичок в Java. Вот что почитать: today.java.net/article/2006/04/04/…
TJR 01

Вы также можете прочитать код printStackTrace (), чтобы точно узнать, что он делает и как.
Питер Лоури

1
Я часто вижу этот шаблон внутри блоков catch: e.printStackTrace(); System.exit(1); Здесь я хочу задать тот же вопрос, что и OP, но в другом ключе: какова именно цель этого? Не будет ли JRE автоматически печатать трассировку стека и завершать работу при возникновении исключения? То есть, здесь не так уж много "обработки исключений", верно ??
Owen

1
Как правило, это очень плохая идея , поскольку она подавляет исключение - к сожалению, это то, что Eclipse и другие IDE часто автоматически предлагают в качестве тела для блока catch, поэтому он используется гораздо чаще, чем должен.
dimo414

Ответы:


100

Это метод Exceptionэкземпляров, который выводит трассировку стека экземпляра вSystem.err .

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

Вот пример того, как это можно использовать на практике:

try {
    // ...
} catch (SomeException e) { 
    e.printStackTrace();
}

2
И, благодаря проверенным исключениям, это, вероятно, содержание catchблоков №1 :-)
Джоуи

3
@Joey Orthrow new RuntimeException(e)
Барт ван Хёкелом

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

42

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

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)

Это нормально: в первом случае вы вызываете toString () ошибки, а во втором вы просите распечатать все stackTrace из ошибки. Это 2 разные вещи.
Джон

1
System.err.println(e);будет уместнее.
roottraveller

14

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

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


11

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

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

printStackTrace()Это хорошая идея, наряду с методом e.getmessage().


6

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

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


2

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


2

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

  1. Название исключения.
  2. Описание исключения.
  3. Расположение исключения в исходном коде.

Три метода, описывающих исключение на консоли (в которых printStackTrace является одним из них):

  1. printStackTrace()
  2. toString()
  3. 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());  
         }
    }
}

1

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 ... в ClassName.methodName (fileName: 5)


0

Какая польза от метода 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)

-1

Смотрите изображение здесь

printStackTrace() сообщает, в какой строке вы получаете ошибку или почему вы получаете ошибку.

Пример:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.