this == null ne fonctionne-t-il pas dans une méthode d'une classe récursive ?null lance déjà une erreur avant d'entrer dans le corps de la méthodeUne classe Node<E> modélise une liste chaînée récursive. On tente d'y ajouter une méthode length() qui teste this == null.
int length() { if (this == null) return 0; ... } — ce code ne produira jamais le résultat attendu.null.length() lance une NullPointerException avant d'entrer dans la méthode, donc if (this == null) ne sera jamais vrai.Une classe Node<E> modélise une liste chaînée récursive. On tente d'y ajouter une méthode length() qui teste this == null.
On essaie d'écrire la méthode length() sur la classe récursive en testant this == null pour traiter le cas liste vide :
class Node<E> {
E head;
Node<E> tail;
Node(E h, Node<E> t) { head = h; tail = t; }
int length() {
if (this == null) return 0; // intention : cas liste vide
return 1 + tail.length();
}
}
On appelle length() sur une variable null et on constate l'erreur : la JVM lance une NullPointerException avant d'entrer dans length(), donc le test this == null est inatteignable :
Node<Integer> liste = null;
liste.length(); // NullPointerException ici, avant même d'entrer dans length()
// le corps de length() n'est jamais atteint
On conclut qu'il faut une solution différente : une méthode statique ou un container. La méthode statique évite le problème mais ne tire pas parti du dispatch dynamique :
// Approche statique (contournement, pas la solution élégante)
static <E> int length(Node<E> n) {
if (n == null) return 0; // ici n peut être null, pas this
return 1 + length(n.tail);
}
Le test this == null à l'intérieur d'une méthode d'instance est toujours faux : si l'objet est null, la JVM lève une NullPointerException à l'appel, bien avant d'entrer dans le corps de la méthode.
Les applications suivantes et la correction guidée sont réservées aux membres Premium
La méthode et sa première application corrigée restent en accès libre. Le Premium débloque les applications suivantes, l'aide IA et le suivi de ta maîtrise.