Jakie jest zastosowanie metody printStackTrace () w Javie?


98

Przechodzę przez program używający gniazd. W nim printStackTracejest wywoływany na IOExceptionobiekcie w bloku catch.
Co printStackTrace()właściwie robi?

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

Nie jestem świadomy jego celu. Do czego jest to używane?


47
Jedną z najpotężniejszych funkcji nowoczesnych IDE jest możliwość wyszukiwania dokumentacji (zwanej javadoc) dla danej metody Java. W Eclipse jest to Shift-F2, gdy kursor jest umieszczony na nazwie metody printStackTrace.
Thorbjørn Ravn Andersen

2
Wygląda na to, że jesteś nowy w Javie. Coś do przeczytania: dzisiaj.java.net/article/2006/04/04/...
TJR

Możesz także przeczytać kod printStackTrace (), aby zobaczyć dokładnie, co robi i jak to robi.
Peter Lawrey

1
Często widzę ten wzór w blokach catch: e.printStackTrace(); System.exit(1); Tutaj chcę zadać to samo pytanie co OP, ale w innym duchu: Jaki dokładnie jest tego cel? Czy środowisko JRE nie wydrukuje automatycznie śladu stosu i zakończy działanie, gdy zostanie zgłoszony wyjątek? To znaczy, tak naprawdę nie dzieje się tutaj zbyt wiele „Obsługa wyjątków”, prawda?
Owen

1
Jest to również ogólnie bardzo zły pomysł , ponieważ blokuje wyjątek - niestety to właśnie Eclipse i inne środowiska IDE często automatycznie sugerują jako treść bloku catch, więc jest używany znacznie częściej niż powinien.
dimo414

Odpowiedzi:


100

Jest to metoda na Exceptioninstancjach, która drukuje ślad stosu instancjiSystem.err .

To bardzo proste, ale bardzo przydatne narzędzie do diagnozowania wyjątków. Informuje, co się stało i gdzie w kodzie to się stało.

Oto przykład, jak można go wykorzystać w praktyce:

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

2
A dzięki sprawdzonym wyjątkom to prawdopodobnie zawartość nr 1 catchbloków :-)
Joey

3
@Joey Orthrow new RuntimeException(e)
Bart van Heukelom

3
jednak jest to uważane za złą praktykę, ponieważ nie jest bezpieczne dla wątków. Użyj instrukcji rejestratora i umieść ją tam.
Karidrgn

41

To też mnie zaciekawiło, więc stworzyłem mały przykładowy kod, w którym możesz zobaczyć, co robi:

try {
    throw new NullPointerException();
}
catch (NullPointerException e) {
    System.out.println(e);
}

try {
    throw new IOException();
}
catch (IOException e) {
    e.printStackTrace();
}
System.exit(0);

Wołanie println(e):

java.lang.NullPointerException

Wołanie e.printStackTrace():

java.io.IOException
      at package.Test.main(Test.java:74)

Jest to normalne, w pierwszym przypadku wywołujesz metodę toString () błędu, aw drugim chcesz wydrukować cały stackTrace z błędu. To dwie różne rzeczy.
Jon

1
System.err.println(e);będzie bardziej odpowiedni.
roottraveller

14

Pomaga prześledzić wyjątek. Na przykład, piszesz jakieś metody w swoim programie, a jedna z nich powoduje błąd. Wtedy printstack pomoże ci zidentyfikować, która metoda powoduje błąd. Stos pomoże w ten sposób:

Najpierw twoja główna metoda zostanie wywołana i wstawiona do stosu, następnie druga metoda zostanie wywołana i wstawiona do stosu w kolejności LIFO, a jeśli jakikolwiek błąd wystąpi gdzieś wewnątrz dowolnej metody, ten stos pomoże zidentyfikować tę metodę.


11

printStackTrace()pomaga programiście zrozumieć, gdzie wystąpił rzeczywisty problem. printStacktrace()Jest to metoda klasy Throwablez java.langpakietu. Wyświetla kilka wierszy w konsoli wyjściowej. Pierwsza linia składa się z kilku strun. Zawiera nazwę podklasy Throwable i informacje o pakiecie. Począwszy od drugiego wiersza, opisuje pozycję błędu / numer wiersza zaczynający się od at.

Ostatni wiersz zawsze opisuje miejsce docelowe, którego dotyczy błąd / wyjątek. Druga ostatnia linia informuje nas o następnej linii na stosie, do której przechodzi kontrola po otrzymaniu transferu z numeru linii opisanego w ostatniej linii. Błędy / wyjątki reprezentują dane wyjściowe w postaci stosu, które zostały wprowadzone do stosu fillInStackTrace()metodą Throwableklasy, która sama wypełnia szczegóły transferu sterowania programem do stosu wykonywania. Linie zaczynające się od at, to nic innego jak wartości stosu wykonywania. W ten sposób programista może zrozumieć, gdzie w kodzie znajduje się rzeczywisty problem.

Wraz z printStackTrace()metodą warto użyć e.getmessage().


6

printStackTrace()wypisuje lokalizacje, w których wystąpił wyjątek w kodzie źródłowym, umożliwiając autorowi, który napisał program, sprawdzenie, co poszło nie tak. Ale ponieważ pokazuje problemy w kodzie źródłowym, użytkownicy, którzy mogą lub nie mają doświadczenia w kodowaniu, mogą nie być w stanie zrozumieć, co poszło nie tak, więc jeśli program umożliwia użytkownikowi wysyłanie komunikatów o błędach do autorów, użytkownicy mogą nie być w stanie podać dokładnych danych na temat tego, co poszło nie tak.

Powinieneś rozważyć Logger.getLogger()metodę, która oferuje lepszą obsługę wyjątków (rejestrowanie), a poza tym printStackTrace()bez argumentów jest uważana za przestarzałą i powinna być używana TYLKO do celów debugowania, a nie do wyświetlania użytkownika.


2

printStackTrace()Pomaga programista zrozumieć, gdzie wystąpił rzeczywisty problem. printStackTrace()Metoda jest członkiem klasy Throwablew java.langpakiecie.


2

printStackTracejest metodą Throwableklasy. Ta metoda wyświetla komunikat o błędzie w konsoli; gdzie otrzymujemy wyjątek w kodzie źródłowym. Te metody mogą być używane z blokiem catch i opisują:

  1. Nazwa wyjątku.
  2. Opis wyjątku.
  3. Lokalizacja wyjątku w kodzie źródłowym.

Trzy metody opisujące wyjątek na konsoli (w której printStackTrace jest jedną z nich) to:

  1. printStackTrace()
  2. toString()
  3. getMessage()

Przykład:

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 () pomaga programiście zrozumieć, gdzie wystąpił rzeczywisty problem. Pomaga prześledzić wyjątek. jest to metoda printStackTrace () klasy Throwable dziedziczona przez każdą klasę wyjątków. Ta metoda wyświetla ten sam komunikat obiektu e, a także numer wiersza, w którym wystąpił wyjątek.

Poniżej znajduje się kolejny przykład stosu drukowania wyjątku w Javie.

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: To jest nowy wyjątek w Javie ... w ClassName.methodName (fileName: 5)


0

Jakie jest zastosowanie metody e.printStackTrace () w Javie?

Cóż, celem korzystania z tej metody e.printStackTrace();jest sprawdzenie, co jest nie tak.

Na przykład chcemy obsłużyć wyjątek. Spójrzmy na następujący przykład.

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();
    }
  }
}

Użyłem metody e.printStackTrace();, aby dokładnie pokazać, co jest nie tak.

Na wyjściu widzimy następujący wynik.

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

Zobacz zdjęcie tutaj

printStackTrace() informuje, w której linii pojawia się błąd oraz dlaczego pojawia się błąd.

Przykład:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.