À quoi sert la méthode printStackTrace en Java ?
printStackTrace() est la méthode la plus connue de la classe Throwable. Elle affiche sur System.err la pile d'appels complète qui a mené à l'exception — un outil indispensable pour le debug, mais à utiliser avec discernement en production.
Usage minimal
try {
int x = Integer.parseInt("abc");
} catch (NumberFormatException e) {
e.printStackTrace();
}
Sortie sur System.err :
java.lang.NumberFormatException: For input string: "abc"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at com.example.Main.main(Main.java:7)
Chaque ligne indique une méthode active au moment de l'exception, de la plus récente à l'origine.
Rediriger vers un flux précis
Par défaut, la trace va sur System.err. Pour la diriger ailleurs :
import java.io.PrintStream;
import java.io.PrintWriter;
e.printStackTrace(System.out); // vers stdout
e.printStackTrace(new PrintWriter("erreur.log")); // vers un fichier
e.printStackTrace(new PrintStream(outputStream)); // vers un OutputStream
Capturer la trace dans une String
Pour logger la trace ou la retourner dans une réponse d'erreur :
import java.io.StringWriter;
import java.io.PrintWriter;
public static String stackTraceAsString(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
À partir de Java 9, une alternative plus élégante utilise StackWalker pour capturer seulement les frames qui vous intéressent.
Pourquoi ne pas l'utiliser en production
printStackTrace écrit directement sur System.err — non bufferisé, non horodaté, non formaté, non routé vers un collecteur de logs. Résultat :
- Les traces se mélangent avec les logs produits par SLF4J / Log4j.
- Impossible de les filtrer par niveau (DEBUG/INFO/ERROR).
- Impossible de les désactiver centralement.
- Inutilisables par ELK, Splunk, Datadog — pas de format structuré.
La vraie bonne pratique : utiliser un logger
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(MaClasse.class);
try {
int x = Integer.parseInt("abc");
} catch (NumberFormatException e) {
logger.error("Échec du parsing", e); // trace complète, formatée, routée
}
SLF4J log automatiquement la stack trace quand on passe l'exception en dernier argument. La sortie est horodatée, triable, configurable.
Cas où printStackTrace reste acceptable
- Code jetable : script one-shot, script de migration, POC.
- Exercices et TP où l'on apprend les exceptions.
- Phase de debug local rapide avant de brancher un vrai logger.
Dans toute application destinée à tourner plus d'une fois, remplacez-le par un appel au logger. La dette technique à faire ce remplacement plus tard est disproportionnée par rapport au coût de bien faire dès le départ.
Lire une stack trace efficacement
Pour diagnostiquer une erreur, lisez du bas vers le haut :
- La dernière ligne indique où votre code a lancé / propagé l'exception.
- Les lignes du milieu montrent le chemin à travers les frameworks.
- La ligne du haut nomme l'exception et son message.
Un Caused by: en milieu de trace révèle une exception enveloppée — c'est souvent là que se cache la vraie cause.