Bonjour,

J’ai dû rater une subtilité grosse comme une poutre, mais je dois admettre que cela me laisse dubitatif.
J’ai créé une classe destiné, à terme, à ma faciliter la gestion des logs (basés sur Log4J).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
import org.apache.log4j.*;
 
public class Log extends Logger {
 
    static final Logger logger = Logger.getLogger("MonLog");
 
    /** Creates a new instance of Log */
    protected Log(String name) {
        super(name);
        BasicConfigurator.configure();
        logger.setLevel(Level.INFO);
    }
 
/* …
Je compte placer ici mes fonctions perso 
*/
}
Comme vous le constatez, cette classe hérite de org.apache.log4j.Logger.

Lorsque j’utilise cette classe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
    public static void main(String args[]) {
        Log log = new Log("MonLog");
        log.info("Mon texte à afficher");
    }
Je me retrouve avec une exception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
Exception in thread "main" java.lang.NullPointerException
        at org.apache.log4j.Category.info(Category.java:753)
        at TstMain.main(TstMain.java:21)
Java Result: 1
Alors que si je complète ma classe Log avec une méthode info() qui se contente de faire appel à son homologue dans Logger :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.apache.log4j.*;
 
public class Log extends Logger {
 
    static final Logger logger = Logger.getLogger("MonLog");
 
    /** Creates a new instance of Log */
    protected Log(String name) {
        super(name);
        BasicConfigurator.configure();
        logger.setLevel(Level.INFO);
    }
 
  public void info(Object message) {
      logger.info(message);
  }
 
/* …
Je compte placer ici mes fonctions perso 
*/
 
}
Cela fonctionne très bien.

Bref, il y a-t-il une subtilité dans la classe Logger que je n’aurais pas perçu ?
Celle-ci héritant de la classe Category (qui implémente la méthode info()), je trouve normal de pouvoir acceder à la méthode depuis un objet Logger. Cependant, je ne vois pas pourquoi mon objet Log (héritant lui-même de Logger) ne peux pas exploiter la méthode info() sans avoir à la redéfinir.

Quelqu’un est-il plus inspiré que moi ?

Chris