web-dev-qa-db-fra.com

Que signifie une erreur de compilation "Impossible de trouver le symbole"?

Veuillez expliquer ce qui suit à propos de l'erreur "Impossible de trouver le symbole":

  • Que signifie cette erreur?
  • Quelles choses peuvent causer cette erreur?
  • Comment le programmeur s'y prend-il pour corriger cette erreur?

Cette question est conçue pour être une question complète sur les erreurs de compilation "ne trouve pas de symbole" en Java.

318
Stephen C

Vous obtiendrez également cette erreur si vous oubliez une new:

String s = String();

versus

String s = new String();
21
thinkterry

Un autre exemple de "Variable est hors de portée"

Comme j'ai déjà vu ce genre de questions à quelques reprises, peut-être un autre exemple de ce qui est illégal, même si cela peut sentir bien.

Considérons ce code:

if(somethingIsTrue()) {
  String message = "Everything is fine";
} else {
  String message = "We have an error";
}
System.out.println(message);

C'est un code invalide. Parce qu'aucune des variables nommées message n'est visible en dehors de leur portée respective - ce qui serait les parenthèses entourant {} dans ce cas. 

Vous pourriez dire: "Mais une variable nommée message est définie de toute façon - le message is défini après le if". 

Mais tu aurais tort. 

Java n'a pas d'opérateur free() ni delete; il doit donc s'appuyer sur la portée de la variable de suivi pour déterminer quand les variables ne sont plus utilisées (avec les références à ces variables de cause). 

C'est particulièrement grave si vous pensiez avoir fait quelque chose de bien. J'ai vu ce genre d'erreur après avoir "optimisé" un code comme celui-ci:

if(somethingIsTrue()) {
  String message = "Everything is fine";
  System.out.println(message);
} else {
  String message = "We have an error";
  System.out.println(message);
}

"Oh, il y a du code en double, tirons cette ligne commune" -> et le voilà.

Le moyen le plus courant de traiter ce type de problème de portée est de pré-assigner les valeurs else aux noms de variable de la portée externe, puis de les réaffecter si:

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);
14
Jan

Une façon d'obtenir cette erreur dans Eclipse: 

  1. Définissez une classe A dans src/test/Java.
  2. Définissez une autre classe B dans src/main/Java qui utilise la classe A.

Résultat: Eclipse compilera le code, mais maven donnera le symbole "Impossible de trouver le symbole".

Cause sous-jacente: Eclipse utilise un chemin de génération combiné pour les arborescences principale et de test. Malheureusement, il ne prend pas en charge l’utilisation de différents chemins de construction pour différentes parties d’un projet Eclipse, comme le requiert Maven.

Solution : 

  1. Ne définissez pas vos dépendances de cette façon; c'est-à-dire ne commettez pas cette erreur.
  2. Construisez régulièrement votre base de code avec Maven afin de pouvoir détecter cette erreur plus tôt. Une façon de le faire est d'utiliser un serveur CI.
8
Joel Costigliola

"Impossible de trouver" signifie que, le compilateur qui ne trouve pas la variable, méthode, classe, etc ... appropriés, si vous avez ce type de message d'erreur, vous devez tout d'abord rechercher la ligne de code où obtenir le message d'erreur .. capable de trouver quelle variable, méthode ou classe n’a pas défini avant de l’utiliser.Après confirmation, initialisez cette variable, méthode ou classe pour une utilisation ultérieure. Demandez-vous de l’exemple suivant.

Je vais créer un cours de démonstration et imprimer un nom ...

class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}

Maintenant regarde le résultat ..

 enter image description here

Cette erreur dit, "nom de variable ne peut pas trouver" .. La définition et la valeur d'initialisation de la variable 'nom' peuvent être supprimées de cette erreur..En fait, comme ça,

class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}

Maintenant, regardez la nouvelle sortie ...

 enter image description here

Ok A résolu avec succès cette erreur..Au même moment, si vous pouviez obtenir quelque chose "ne trouve pas de méthode" ou "ne trouve pas de classe", définissez tout d'abord une classe ou une méthode et après utilisation .. 

3
GT_hash

Si vous obtenez cette erreur dans la construction ailleurs, alors que votre IDE dit que tout va bien, vérifiez que vous utilisez les mêmes versions de Java aux deux endroits.

Par exemple, Java 7 et Java 8 ayant des API différentes, l'appel d'une API non existante dans une version Java plus ancienne provoquerait cette erreur.

2
Jonathan Lin

Pour obtenir des conseils, examinez de plus près le nom du nom de classe qui génère une erreur et le numéro de ligne, par exemple: Échec de compilation [ERREUR]\applications\xxxxx.Java: erreur [44,30]: impossible de trouver le symbole

Une autre cause est une méthode non prise en charge de la version Java, telle que jdk7 vs 8 . Vérifiez votre% Java_HOME%. 

0
Striker

Si le chemin de génération Java Eclipse est mappé sur 7, 8 et que, dans Project pom.xml, les propriétés Maven, Java.version est mentionné dans la version Java supérieure (9,10,11, etc.,) à 7,8, que vous devez mettre à jour dans pom. fichier XML.

Dans Eclipse, si Java est mappé à Java version 11 et dans pom.xml, il est mappé à Java version 8. Mettez à jour le support Eclipse vers Java 11 en suivant les étapes décrites dans Eclipse IDEHelp -> Installer un nouveau logiciel -> 

Coller le lien suivant http://download.Eclipse.org/Eclipse/updates/4.9-P-builds à Work With

ou

Ajouter (la fenêtre contextuelle s'ouvrira) ->

Name: support de Java 11 Location:http://download.Eclipse.org/Eclipse/updates/4.9-P-builds

puis mettez à jour la version Java dans les propriétés Maven du fichier pom.xml comme ci-dessous

<Java.version>11</Java.version>
<maven.compiler.source>${Java.version}</maven.compiler.source>
<maven.compiler.target>${Java.version}</maven.compiler.target>

Enfin, faites un clic droit sur le projet Debug as -> Maven clean, étapes de construction de Maven

0
pudaykiran

vous avez compilé votre code à l'aide de maven compile puis utilisé le test maven pour l'exécuter a bien fonctionné. Maintenant, si vous avez changé quelque chose dans votre code et que, sans la compilation, vous l'exécutez, vous obtiendrez cette erreur.

Solution: compilez à nouveau, puis exécutez test. Pour moi, cela a fonctionné de cette façon.

0
ANIL KUMAR

Moi aussi j'ai eu cette erreur. (pour lequel j'ai googlé et j'ai été dirigé vers cette page)

Problème: J'appelais une méthode statique définie dans la classe d'un projet A à partir d'une classe définie dans un autre projet B. J'obtenais l'erreur suivante:

error: cannot find symbol

Solution: J'ai résolu ce problème en construisant d'abord le projet dans lequel la méthode est définie, puis le projet à partir duquel la méthode était appelée.

0
Maria