Qual è l'uso del metodo printStackTrace () in Java?


98

Sto eseguendo un programma socket. In esso, printStackTraceviene richiamato l' IOExceptionoggetto nel blocco catch.
Cosa fa printStackTrace()effettivamente?

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

Non sono a conoscenza del suo scopo. A cosa serve?


47
Una delle funzionalità più potenti negli IDE moderni è la capacità di cercare la documentazione (chiamata javadoc) per un determinato metodo Java. In Eclipse è Shift-F2 quando il cursore è posizionato sul nome del metodo printStackTrace.
— Thorbjørn Ravn Andersen

2
Sembra che tu sia nuovo su Java. Ecco qualcosa da leggere: today.java.net/article/2006/04/04/…
— TJR

Puoi anche leggere il codice di printStackTrace () per vedere esattamente cosa fa e come lo fa.
— Peter Lawrey

1
Vedo spesso questo modello all'interno dei blocchi di cattura: e.printStackTrace(); System.exit(1); qui voglio porre la stessa domanda dell'OP, ma in una vena diversa: qual è esattamente lo scopo di questo? JRE non stamperà automaticamente lo stacktrace ed uscirà, quando viene generata l'eccezione? Cioè, non c'è davvero molto "Gestione delle eccezioni" in corso qui, giusto ??
— Owen

1
È anche generalmente una pessima idea , poiché sopprime l'eccezione - sfortunatamente è ciò che Eclipse e altri IDE spesso suggeriscono automaticamente come corpo per il blocco di cattura, quindi è usato molto più spesso di quanto dovrebbe essere.
— dimo414

Risposte:


100

È un metodo sulle Exceptionistanze che stampa la traccia dello stack dell'istanza suSystem.err .

È uno strumento molto semplice, ma molto utile per diagnosticare un'eccezione. Ti dice cosa è successo e dove nel codice è successo.

Ecco un esempio di come potrebbe essere utilizzato nella pratica:

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

2
E grazie alle eccezioni verificate è probabilmente il contenuto n. 1 dei catchblocchi :-)
— Joey

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

3
tuttavia è considerata una cattiva pratica in quanto non è threadsafe. Usa l'istruzione logger e includila lì.
— Karidrgn

42

Ero un po 'curioso anche di questo, quindi ho appena messo insieme un piccolo codice di esempio in cui puoi vedere cosa sta facendo:

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

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

Chiamando println(e):

java.lang.NullPointerException

Chiamando e.printStackTrace():

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

Questo è normale, con il primo si chiama toString () dell'errore, e nel secondo si chiede di stampare tutto lo stackTrace dall'errore. Sono due cose diverse.
— Jon

1
System.err.println(e);sarà più appropriato.
— roottraveller

14

Aiuta a rintracciare l'eccezione. Ad esempio, stai scrivendo alcuni metodi nel tuo programma e uno dei tuoi metodi causa un bug. Quindi printstack ti aiuterà a identificare quale metodo causa il bug. Stack aiuterà in questo modo:

Per prima cosa il tuo metodo principale verrà chiamato e inserito nello stack, quindi il secondo metodo verrà chiamato e inserito nello stack in ordine LIFO e se si verifica un errore da qualche parte all'interno di un metodo, questo stack aiuterà a identificare quel metodo.


11

printStackTrace()aiuta il programmatore a capire dove si è verificato il problema reale. printStacktrace()è un metodo della classe Throwabledi java.langpacchetto. Stampa diverse righe nella console di output. La prima riga è composta da diverse stringhe. Contiene il nome della sottoclasse Throwable e le informazioni sul pacchetto. Dalla seconda riga in poi, descrive la posizione / numero di riga dell'errore che inizia con at.

L'ultima riga descrive sempre la destinazione interessata dall'errore / eccezione. La penultima riga ci informa sulla riga successiva nello stack dove va il controllo dopo aver ottenuto il trasferimento dal numero di riga descritto nell'ultima riga. Gli errori / eccezioni rappresentano l'output sotto forma di stack, che sono stati inseriti nello stack tramite il fillInStackTrace()metodo di Throwableclasse, che a sua volta riempie i dettagli del trasferimento del controllo del programma nello stack di esecuzione. Le righe che iniziano con at, non sono altro che i valori dello stack di esecuzione. In questo modo il programmatore può capire dove si trova nel codice il vero problema.

Insieme al printStackTrace()metodo, è una buona idea usare e.getmessage().


6

printStackTrace()stampa le posizioni in cui si è verificata l'eccezione nel codice sorgente, consentendo così all'autore che ha scritto il programma di vedere cosa è andato storto. Ma poiché mostra problemi nel codice sorgente, gli utenti che possono avere o meno esperienza di codifica potrebbero non essere in grado di capire cosa è andato storto, quindi se il programma consente all'utente di inviare messaggi di errore agli autori, il gli utenti potrebbero non essere in grado di fornire dati validi su cosa è andato storto.

Dovresti considerare il Logger.getLogger()metodo, offre una migliore funzionalità di gestione delle eccezioni (registrazione) e inoltre printStackTrace()senza argomenti è considerato obsoleto e dovrebbe essere usato SOLO per scopi di debug, non per la visualizzazione dell'utente.


2

L' printStackTrace()aiuta il programmatore a capire dove si è verificato il problema reale. Il printStackTrace()metodo è un membro della classe Throwablenel java.langpacchetto.


2

printStackTraceè un metodo della Throwableclasse. Questo metodo visualizza un messaggio di errore nella console; dove stiamo ottenendo l'eccezione nel codice sorgente. Questi metodi possono essere utilizzati con il blocco catch e descrivono:

  1. Nome dell'eccezione.
  2. Descrizione dell'eccezione.
  3. Posizione dell'eccezione nel codice sorgente.

I tre metodi che descrivono l'eccezione sulla console (in cui printStackTrace è uno di loro) sono:

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

Esempio:

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 () aiuta il programmatore a capire dove si è verificato il problema reale. Aiuta a rintracciare l'eccezione. è il metodo printStackTrace () della classe Throwable ereditato da ogni classe di eccezione. Questo metodo stampa lo stesso messaggio di e object e anche il numero di riga in cui si è verificata l'eccezione.

Quello che segue è un altro esempio di stack di stampa dell'eccezione in 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: questa è una nuova eccezione in Java ... in ClassName.methodName (fileName: 5)


0

Qual è l'uso del metodo e.printStackTrace () in Java?

Bene, lo scopo dell'utilizzo di questo metodo e.printStackTrace();è vedere cosa è esattamente sbagliato.

Ad esempio, vogliamo gestire un'eccezione. Diamo uno sguardo al seguente esempio.

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

Ho usato il metodo e.printStackTrace();per mostrare esattamente cosa non va.

Nell'output possiamo vedere il seguente risultato.

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

Vedi l'immagine qui

printStackTrace() dice su quale riga stai ricevendo un errore qualsiasi perché stai ricevendo un errore.

Esempio:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.