141 votes

Comment imprimer les numéros de ligne dans le journal en java ?

Comment imprimer les numéros de ligne dans le journal. Disons que lorsque j'envoie une information dans le journal, je veux également imprimer le numéro de ligne où se trouve cette information dans le code source. Comme nous pouvons le voir dans la trace de la pile, elle affiche le numéro de ligne où l'exception s'est produite. La trace de la pile est disponible sur l'objet exception.

Une autre alternative pourrait être d'inclure manuellement le numéro de ligne lors de l'impression du journal. Existe-t-il un autre moyen ?

4 votes

Voir la réponse sous-estimée de @Juan ci-dessous pour une réponse courte et douce ! Je viens de donner 15 points en rétrogradant toutes les autres réponses :v et en augmentant celle de Juan.

108voto

Simon Buchan Points 6245

De Angsuman Chakraborty (archivé) :

/** Get the current line number.
 * @return int - Current line number.
 */
public static int getLineNumber() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
}

7 votes

Cela renvoie toujours le numéro de ligne de l'instruction de retour dans la méthode appelée et pas nécessairement le numéro de ligne de l'appel de la méthode.

0 votes

Le [2] n'obtient-il pas la trame au-dessus de getLineNumber() ? ([1] étant getLineNumber(), et [0] étant getStackTrace(), probablement).

1 votes

J'ai joué un peu et si vous utilisez blah.getStackTrace[3].getLineNumber() comme corps de méthode, il renvoie le numéro de ligne où la méthode a été appelée.

76voto

Michael Baltaks Points 1137

Nous avons fini par utiliser une classe personnalisée comme celle-ci pour notre travail sur Android :

import android.util.Log;    
public class DebugLog {
 public final static boolean DEBUG = true;    
 public static void log(String message) {
  if (DEBUG) {
    String fullClassName = Thread.currentThread().getStackTrace()[2].getClassName();
    String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
    String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
    int lineNumber = Thread.currentThread().getStackTrace()[2].getLineNumber();

    Log.d(className + "." + methodName + "():" + lineNumber, message);
  }
 }
}

1 votes

Bonjour Michael, merci pour votre solution, elle fonctionne bien pour moi pour afficher les numéros de ligne pour l'info log.... merci encore. J'attends avec impatience vos excellentes solutions pour Android.

3 votes

Je ferais quelques recherches supplémentaires sur ce code avant de l'utiliser. Lorsque j'ai posté le code, getStackTrace()[3] fonctionnait. Cela peut dépendre de la version d'Android ou de la JVM, ou d'un autre facteur.

3 votes

Cette réponse ne fonctionne pas, elle affiche le numéro de ligne, le nom de la classe et le nom de la fonction de la classe DebugLog, mais pas le numéro de ligne de l'appelant de l'autre classe.

37voto

Juan Points 750

Un moyen rapide et sale :

System.out.println("I'm in line #" + 
    new Exception().getStackTrace()[0].getLineNumber());

Avec quelques détails supplémentaires :

StackTraceElement l = new Exception().getStackTrace()[0];
System.out.println(
    l.getClassName()+"/"+l.getMethodName()+":"+l.getLineNumber());

Cela donnera quelque chose comme ceci :

com.example.mytest.MyClass/myMethod:103

1 votes

System.out.println("i am here: " + new Exception().getStackTrace()[0]); me donne tous les détails dont j'ai besoin :)

0 votes

Notez que la JVM n'est pas assurée de fournir une trace de pile lorsque cela est correct. Je ne crois pas que Hotspot fasse cette garantie non plus (mais ses stacktraces sont normalement corrects).

0 votes

Très propre, classe StackTraceElement l = new Exception().getStackTrace()[1] ; travailler avec moi

25voto

James A Wilson Points 7274

Je suis obligé de répondre en ne répondant pas à votre question. Je suppose que vous cherchez le numéro de ligne uniquement pour faciliter le débogage. Il y a de meilleurs moyens. Il y a des moyens pirates pour obtenir la ligne actuelle. Toutes celles que j'ai vues sont lentes. Il est préférable d'utiliser un cadre de journalisation comme celui du paquet java.util.logging ou log4j . Grâce à ces paquets, vous pouvez configurer vos informations de journalisation de manière à inclure le contexte jusqu'au nom de la classe. Ainsi, chaque message de journalisation sera suffisamment unique pour savoir d'où il provient. En conséquence, votre code comportera une variable "logger" que vous appellerez par l'intermédiaire de

logger.debug("a really descriptive message")

au lieu de

System.out.println("a really descriptive message")

15voto

Jim Kiley Points 2754

Log4J vous permet d'inclure le numéro de ligne dans son modèle de sortie. Voir http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html pour plus de détails sur la façon de procéder (l'élément clé du modèle de conversion est "L"). Cependant, la Javadoc inclut ce qui suit :

AVERTISSEMENT La génération des informations de localisation de l'appelant est extrêmement lente. Son son utilisation doit être évitée à moins que la d'exécution ne soit pas un problème.

0 votes

Le mécanisme sous-jacent est devenu beaucoup plus rapide dans les versions plus récentes de la JVM, mais il doit encore être utilisé avec parcimonie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X