TUTORIELS 
Dix erreurs à éviter en Java

Page 1 | 2

Les bases à connaître pour s'éviter un déboguage long et laborieux: syntaxe, oublis ou trop grande confiance sont quelques-unes des causes d'erreurs intempestives.
 (26 novembre 2002)
 

Tous les programmeurs doivent, à un moment ou un autre - en tous cas régulièrement -, revenir dans leur code pour trouver la raison pour laquelle les choses ne fonctionnent pas comme elles le devraient. Si certaines erreurs sont inévitables, d'autres restent récurrentes alors qu'il est relativement facile de les éviter, même sans grande habitude du langage.
Nous allons donc ici tenter de résumer les erreurs les plus courantes (et les plus importantes), celles qui, une fois débusquées, tendent à désespérer celui qui les a commises...

1) Majuscules et autres erreurs de syntaxe
Une erreur encore très courante chez les débutants est d'oublier que Java est un langage sensible à la casse (il tient compte de la différence entre une lettre majuscule et la même en minuscule). Ainsi, il est possible d'avoir deux variables différentes appellées variable et Variable (même si cela est très fortement déconseillé.
De même, les classes en Java commencent toujours par une majuscule.
button main = new button();
provoquera une erreur de compilation. La forme correcte est:
Button main = new Button();

Une erreur de syntaxe évidente et pourtant elle aussi courante: l'oubli ou le mauvais positionnement du point-virgule (;). L'oubli du point-virgule à la fin d'une instruction n'est pas en soit extrêmement grâve: le compilateur repère l'erreur directement, ce qui facilite la correction.
En revanche, il peut arriver que l'on mettre un point-virgule là où il n'en faut pas. Par exemple, en voulant convertir une boucle do-while en boucle while, il se peut que l'on oublie d'effacer le fameux caractère:

do
  {
  ...instructions...
  }
while ( condition );

...donnerait...

while ( condition );
  {
  ...instructions...
  }

La position du point-virgule a pour effet de donner une boucle while "vide", suivi d'un bloc d'instructions qui ne sera exécuté qu'une seule fois. Par ailleurs, il est probable que la boucle sera infinie, étant donné que le code qui devra rendre la condition fausse ne sera pas exécuté correctement...

Enfin, dernière cruelle évidence: ne jamais oublier de fermer les paranthèses(()), crochets ([]), accolades ({}), guillemets ("") ou apostrophes ('') ouverts. Par exemple, oublier de fermer une parenthèse vous donnera une longue liste d'erreurs à la compilation. Autant s'éviter une telle frustration et perte de temps en prenant l'habitude de toujours commencer par ouvrir puis fermer ses parenthèses (ou ses crochets, ou ses accolades, ...), puis d'y écrire le contenu.

2) Utilisation de ==
Passons sur le fait de ne pas confondre "=" avec "=="...
Une erreur très courante est de chercher à comparer deux chaînes à l'aide de l'opérateur ==. Il s'agit ici d'un problème de sémantique: les chaînes en Java étant des objets de la classe java.lang.String, cet opérateur appliqué à des objets ne fait que tester l'égalité des référénces des variables, et non celles de leurs contenus.

String chaine1 = "coucou";
String chaine2 = "cou";
Boolean test;
chaine2 = chaine2 + chaine2;
test = ( chaine1 == chaine2 ); // test renvoi "false"

Pour tester l'égalité de deux chaînes de caractères, il faut utiliser la méthode equals() de l'objet String:

test = chaine1.equals(chaine2); // test renvoi "true"

C'est une erreur subtile parce que le code se compile sans problème (le code est légal), mais ne fait pas du tout ce que l'on souhaite...
Dans le même ordre d'idées (mais provoquant cette fois une erreur de compilation), il ne faut pas utiliser les opérateurs > ou <= pour comparer deux chaînes, mais faire appel à la méthode compareTo() de l'objet String. L'ensemble des méthodes de String est expliqué sur le site de Sun.

3) Eviter les boucles infinies
Oubli simple mais très efficace dès qu'il s'agit de geler une application: faire évoluer la condition d'une boucle afin de la rendre fausse au bout d'un certain temps.

while(x<21)
{
g.drawString(x,10,y);
y+=20;
}

...se compile sans problème, mais parce qu'on a oublié d'introduire l'indispensable incrémentation de la valeur testée x, la condition serait toujours vraie et la boucle sera infinie...

4) Utilisation des fichiers
Deux règles de base: un fichier doit contenir une et une seule classe publique, et de fait, le nom du fichier doit être de la forme nomDeLaClasse.java. Si l'on place plusieurs classes dans un fichier, ou si le fichier n'est pas nommé exactement comme la classe qu'il contient, le compilateur affichera un message d'erreur...

5) Commentaires
On le répète encore et toujours, souvent en vain: l'utilisation de commentaires est une part essentielle du processus de programmation. Il ne faut pas partir du principe que "si le code a été difficile à écrire, il devrait être difficile à comprendre": en expliquant votre code en langage naturel (= compréhensible pour les autres programmeurs), vous ne faites pas qu'aider d'autres personnes à comprendre et modifier/réutiliser votre code, vous vous aidez aussi vous-même quand dans six mois, le manager vous demandera de modifier une fonction ou d'en ajouter de nouvelles.
L'indentation fait aussi partie de la bonne manière d'écrire un programme.
Même si un programme doit être rendu pour le lendemain et que vous pensez devoir y passer la nuit, il ne faut pas pour autant mettre de coté les commentaires pour y revenir plus tard: le fait de passer des journées entières sur du code laisse croire que l'on connait tous ces travers par coeur, mais lorsque viendra l'heure d'écrire ces commentaires, qui sait si vous n'aurez pas déjà perdu l'aisance que vous aviez lors de l'écriture du code ?
Ajoutons que les JavaDoc permettent de générer automatiquement une documentation au format HTML à partir des commentaires placés dans votre code source: il est donc de bon usage de commencer dès maintenant à écrire ses commentaires dans le bon format.

Page 1 | 2

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page