Java : atelier de débogage

Si une erreur que vous obtenez n'est pas répertoriée ci-dessous ou si les explications ci-dessous vous paraissent insuffisantes, n'hésitez pas à envoyer un mail : vous résoudrez votre problème et la page sera enrichie pour ceux qui la consulteront ensuite.

Erreurs de compilation

  1. ';' expected (point-virgule attendu) :
    il manque un point-virgule à la fin de la ligne précédente
  2. unexpected return value (valeur de retour non attendue) :
    Vous essayez à tort de retourner une valeur, alors que vous êtes en train d'écrire une procédure.
  3. unreachable statement (instruction inatteignable) :
    l'instruction return de la ligne précédente termine la méthode !
  4. illegal start of expression (mauvais début d'expression) :
    Avez-vous oublié un point-virgule à la fin de la ligne précédente ?
    OU Seriez-vous en train de définir une méthode à l'intérieur du corps d'une autre méthode ?
  5. reached end of file (le compilateur a atteint prématurément la fin du fichier) :
    il manque une accolade fermante (reste à trouver laquelle ... et c'est plus facile en les commentant toutes)
  6. incompatible types (types incompatibles) :
    dans une instruction variable = expression; , l'expression a une valeur d'un type différent de celui déclaré pour la variable
  7. cannot find symbol - variable V (Le compilateur ne trouve pas la variable V, c'est-à-dire qu'elle n'a pas été déclarée) :
    Soit V est vraiment une variable qu'on a oublié de déclarer, soit V est une méthode mais on a oublié de mettre () pour l'appeler.
  8. cannot find symbol - method M (Le compilateur ne trouve pas la méthode M dans la classe de l'objet sur lequel vous l'avez appelée) :
    Avez-vous écrit this.M() ? Donc M n'existe pas dans la classe courante.
    OU Avez-vous écrit objet.M() ? Donc vous appelez M sur un objet de la mauvaise classe (c'est-à-dire qui ne comporte pas de méthode M).
    OU Avez-vous juste écrit M() ? Dans ce cas, le compilateur comprend this.M() et on se retrouve dans le premier cas ci-dessus.
  9. cannot find symbol - class C (Le compilateur ne trouve pas la classe nommée C) :
    soit vous avez fait une faute dans le nom de la classe C, soit vous avez oublié d'importer la classe C, soit la structure du code n'est pas correcte, et vous n'avez jamais voulu que C soit un nom de classe
  10. missing return statement (il manque une instruction return) :
    soit c'est une procédure et il faut mettre void dans la signature, soit c'est une fonction et il manque l'instruction return expression; ou bien il faut la placer en toute dernière instruction (exécutée dans tous les cas)
  11. class, interface, or enum expected (déclaration de classe, interface, ou énumération attendue) :
    Avez-vous écrit autre chose qu'un commentaire après l'accolade fermante de la classe ?
    OU Avez-vous oublié un point-virgule à la fin de la ligne précédente ?
  12. unreported exception E; must be caught or declared to be thrown (E est une exception vérifiée : elle doit être attrapée ou bien déclarée comme pouvant être lancée) :
    ajouter un try/catch() autour des instructions ou bien ajouter un throws à la fin de la signature
  13. exception E is never thrown in body of corresponding try statement (l'exception E ne sera jamais lancée par les instructions du bloc try) :
    supprimer le try/catch() ou bien modifier le type de l'exception dans le catch()
  14. M in class C cannot be applied to given types; required: R; found: F; ... (la méthode M de la classe C attend d'autres paramètres; requis: R; trouvés: F; ...) :
    les paramètres doivent être modifiés soit dans l'appel de la méthode M dans la classe courante (pour être conformes à R), soit dans la déclaration de la méthode M dans la classe C (pour être conformes à F)
  15. A has private access in class C (la variable A est privée dans la classe C) :
    La solution n'est jamais de rendre publique la variable A.
    Si l'erreur se situe dans un constructeur d'une sous-classe, appeler le constructeur de la super-classe plutôt que d'initialiser directement l'attribut A.
    Si l'erreur se situe dans une autre méthode, ajouter dans la classe C l'accesseur et/ou le modificateur nécessaire.
  16. M does not override (la méthode M de redéfinit aucune méthode d'une super-classe) :
    La solution n'est jamais de supprimer @Override.
    Il faut juste vérifier que le nom de la méthode est correctement orthographié (à la majuscule près), que les paramètres coorespondent bien en nombre, types et ordre, et que la valeur de retour est du bon type.
    Si c'est bien le cas, la méthode que l'on veut redéfinir est peut-être privée ?
  17. T cannot be dereferenced (on ne peut pas utiliser le type T comme une référence) :
    T est sans doute un des 8 types primitifs ; on ne peut donc pas appeler une méthode sur une variable de type T.
  18. non-static method M cannot be referenced from a static context (la méthode non statique M ne peut pas être utilisée comme si elle était statique) :
    vous avez probablement écrit Classe.M() au lieu de objet.M()
  19. C is not abstract and does not override abstract method M(...) in I (la classe C n'est pas abstraite et ne redéfinit pas la méthode abstraite M de l'interface I) :
    la solution est rarement de déclarer la classe C abstraite (uniquement dans le cas où la méthode M doit rester abstraite dans la classe C),
    mais la plupart du temps de redéfinir la méthode M(...) dans la classe C avec l'exacte signature qu'elle a dans l'interface I.
    Le cas peut aussi se produire si la classe C hérite d'une classe abstraite dans laquelle la méthode M est abstraite.

Erreurs d'exécution