Bonjour,

je suis tombé sur un problème surprenant lié au chargement des classes et/ou peut-être à la compilation.

Pour le reproduire, voici la marche à suivre:
  • Créer une classe ToDelete (vide)
  • Créer une classe LoadedClass contenant la méthode ci-dessous (copiez exactement le code, cf. PS en fin de message)
  • Créer un main qui se contente d'appeler le constructeur de LoadedClass (constructeur par défaut)
  • Lancer le main sans mettre la classe ToDelete dans le classpath


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void method()
    {
        boolean flag = false; // Peut valoir true...
 
        if (flag)
        {
            final ToDelete obj1 = new ToDelete();
        }
        else
        {
            final Object obj2 = new Object();
        }
    }
Là, se produit un joli NoClassDefFoundError sur la classe ToDelete.
Or, la méthode utilisant (parfois) cette classe n'a pas été appelée.

Savez-vous à quoi cela est-il dû?

PS: Pour vous convaincre que cela n'est pas normal, il suffit de modifier légèrement le code de la méthode et de voir qu'une erreur n'est levée. Le code fournit semble très sensible.
Par exemple, vous pouvez:
  • supprimer le flag est mettre directement true ou false dans le if
  • supprimer le else
  • enlever la structure if et conserver les deux affectations
  • etc.