Ce face Exception.printStackTrace
printStackTrace() scrie tipul excepției, mesajul și „stiva de apeluri”: lista metodelor care rulau când a apărut eroarea, de la cea mai recentă la main, fiecare cu fișierul și numărul liniei. Dacă excepția are o cauză, este afișată și ea, după Caused by:.
Fără argumente scrie pe System.err (ieșirea de erori), care poate apărea în altă ordine față de System.out. printStackTrace(System.out) scrie pe ieșirea normală. Aceeași listă o primești ca tablou cu getStackTrace().
Este utilă când depanezi. Într-o aplicație reală, în loc de printStackTrace() se folosește un sistem de jurnalizare (System.Logger, SLF4J), care salvează aceeași informație într-un fișier.
Parametri
| Parametru | Descriere |
|---|---|
destinatie |
Opțional: unde se scrie, de exemplu System.out. |
Ce returnează
Nimic; getStackTrace() returnează un tablou de StackTraceElement.
Exemple
Exemplul 1: Stiva de apeluri a unei erori
Liniile at arată drumul: main a apelat medie, care a apelat suma, unde a apărut eroarea.
public class Main {
static int suma(int[] note) {
int s = 0;
for (int i = 0; i <= note.length; i++) {
s += note[i];
}
return s;
}
static double medie(int[] note) {
return (double) suma(note) / note.length;
}
public static void main(String[] args) {
try {
System.out.println(medie(new int[] {9, 10, 8}));
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace(System.out);
}
}
}
Rezultat
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.suma(Main.java:5)
at Main.medie(Main.java:11)
at Main.main(Main.java:16)
Exemplul 2: Cu cauză: apare și „Caused by”
public class Main {
static int citesteVarsta(String text) {
try {
return Integer.parseInt(text);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Vârstă invalidă în formular", e);
}
}
public static void main(String[] args) {
try {
citesteVarsta("douăzeci");
} catch (IllegalArgumentException e) {
e.printStackTrace(System.out);
}
}
}
Rezultat
java.lang.IllegalArgumentException: Vârstă invalidă în formular
at Main.citesteVarsta(Main.java:6)
at Main.main(Main.java:12)
Caused by: java.lang.NumberFormatException: For input string: "douăzeci"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Integer.parseInt(Integer.java:529)
at java.base/java.lang.Integer.parseInt(Integer.java:626)
at Main.citesteVarsta(Main.java:4)
... 1 more
Exemplul 3: getStackTrace: doar locul erorii
public class Main {
static void valideaza(String email) {
if (!email.contains("@")) throw new IllegalArgumentException("email fără @: " + email);
}
public static void main(String[] args) {
try {
valideaza("ana.exemplu.ro");
} catch (IllegalArgumentException e) {
StackTraceElement loc = e.getStackTrace()[0];
System.out.println(e.getMessage());
System.out.println("Metoda: " + loc.getMethodName() + ", linia " + loc.getLineNumber());
}
}
}
Rezultat
email fără @: ana.exemplu.ro
Metoda: valideaza, linia 3
Greșeli frecvente
- Lași
e.printStackTrace()ca singură tratare în cod de producție. Utilizatorul nu vede nimic util, iar programul continuă ca și cum nimic nu s-ar fi întâmplat. - Te miri că stiva apare înaintea sau după alte mesaje.
System.errșiSystem.outsunt fluxuri diferite.
Comenzi înrudite
Exception: Clasa de bază pentru erorile pe care un program le poate trata; getMessage() returnează mesajul dat la creare.Exception.getCause: Returnează excepția originală care a produs-o pe aceasta (lanț de excepții), sau null dacă nu există.IndexOutOfBoundsException: Apare când folosești o poziție inexistentă: list.get(5) într-o listă de 3 elemente sau un indice negativ.