Що таке метод printStackTrace () в Java?


98

Я проходжу програму розетки. У ньому printStackTraceвикликається IOExceptionоб'єкт в блоці catch.
Що printStackTrace()насправді робить?

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

Я не знаю його призначення. Для чого він використовується?


47
Однією з найпотужніших функцій сучасних середовищ розробки є можливість пошуку документації (званої javadoc) для даного методу Java. У Eclipse це Shift-F2, коли курсор розміщується на імені методу printStackTrace.
Thorbjørn Ravn Andersen

2
Здається, ви новачок у Java. Ось що прочитати: today.java.net/article/2006/04/04/…
TJR

Ви також можете прочитати код printStackTrace (), щоб побачити, що саме він робить і як це робить.
Пітер Лорі

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

1
Зазвичай це також дуже погана ідея , оскільки вона придушує виняток - на жаль, це те, що Eclipse та інші IDE часто автоматично пропонують як тіло для блоку catch, тому воно використовується набагато частіше, ніж повинно бути.
dimo414,

Відповіді:


100

Це метод на Exceptionекземплярах, який друкує трасування стека екземпляраSystem.err .

Це дуже простий, але дуже корисний інструмент для діагностики винятків. Він повідомляє вам, що сталося і де в коді це сталося.

Ось приклад того, як це може бути використано на практиці:

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

2
І завдяки перевіреним виняткам це, мабуть, вміст №1 catchблоків :-)
Джої,

3
@Joey Orthrow new RuntimeException(e)
Bart van

3
однак це вважається поганою практикою, оскільки це не безпечно. Використовуйте оператор реєстрації та додайте його туди.
Karidrgn

41

Мені теж було цікаво з цього приводу, тому я просто зібрав невеликий зразок коду, де ви можете побачити, що він робить:

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)

Це нормально, з 1-го ви викликаєте toString () помилки, а з 2-го запитуєте роздрукувати весь 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.