NoSuchFieldError en Java

1. Vue d'ensemble

Dans cet article, nous allons démontrer la raison de NoSuchFieldError et découvrir comment le résoudre.

2. NoSuchFieldError

Comme son nom l'indique, NoSuchFieldError se produit lorsqu'un champ spécifié n'existe pas. NoSuchFieldError étend la classe IncompatibleClassChangeError et est levée lorsque l'application tente d'accéder ou de modifier un champ d'un objet ou un champ statique d'une classe mais que l'objet ou la classe n'a plus ce champ .

La classe IncompatibleClassChangeError étend la classe LinkageError et se produit lorsque nous effectuons des modifications de définition de classe incompatibles. Enfin, LinkageError étend Error et montre qu'une classe a une certaine dépendance à une autre classe modifiée de manière incompatiible.

Voyons cette erreur en action à l'aide d'un exemple. Dans un premier temps, créons une classe Dependency :

public class Dependency { public static String message = "Hello Baeldung!!"; }

Ensuite, nous allons créer une classe FieldErrorExample qui fait référence à un champ de notre classe Dependency :

public class FieldErrorExample { public static String getDependentMessage() { return Dependency.message; } }

Ajoutons également du code pour vérifier si nous recevons un message de la classe Dependency :

public static void fetchAndPrint() { System.out.println(getDependentMessage()); } 

Maintenant, nous pouvons compiler ces fichiers en utilisant la commande javac , et lors de l'exécution de la classe FieldErrorExample en utilisant la commande java , il imprimera le message spécifié .

Cependant, si nous commentons, supprimons ou modifions le nom de l'attribut dans la classe Dependency et le recompilons, nous rencontrerons notre erreur .

Par exemple, modifions le nom de l'attribut dans notre classe Dependency :

public class Dependency { public static String msg = "Hello Baeldung!!"; }

Maintenant, si nous recompilons uniquement notre classe Dependency , puis exécutons à nouveau FieldErrorExample , nous rencontrerons NoSuchFieldError :

Exception in thread "main" java.lang.NoSuchFieldError: message

L'erreur ci-dessus s'est produite car la classe FieldErrorExample fait toujours référence au message de champ statique de la classe Dependency , mais il n'existe plus - nous avons apporté une modification incompatible à la classe Dependency .

3. Résolution de l'erreur

Pour éviter cette erreur, nous devons nettoyer et compiler les fichiers existants . Nous pouvons le faire en utilisant la commande javac ou avec Maven en exécutant mvn clean install. En effectuant cette étape, nous aurons tous les derniers fichiers compilés et nous éviterons de rencontrer l'erreur.

Si l'erreur persiste, le problème peut provenir de plusieurs fichiers JAR: un lors de la compilation et un autre lors de l'exécution. Cela se produit souvent lorsque l'application dépend de JAR externes. Ici, nous devons valider l'ordre des JAR dans le chemin de construction pour identifier le JAR incohérent.

Si nous devons approfondir nos recherches, il est utile d' exécuter l'application avec l' option -verbose: class pour vérifier les classes chargées. Cela peut nous aider à identifier la classe obsolète.

Parfois, un JAR tiers peut faire référence en interne à une autre version, ce qui entraîne NoSuchFieldError . Si cela se produit, nous pouvons utiliser la dépendance mvn: tree -Dverbose. Cela génère l'arborescence de dépendances maven et nous aide à identifier le JAR incohérent.

4. Conclusion

Dans ce court didacticiel, nous avons montré pourquoi NoSuchFieldError se produit et comment nous pouvons le résoudre.

Comme toujours, le code est disponible sur sur GitHub.