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)
 

6) Oublier de sauvegarder ou compiler
Certains environnements récents font automatiquement la sauvegarde de votre projet avant la compilation. Il peut cependant arriver des erreurs lors de l'utilisation de vieilles versions de fichiers .class.
Ainsi, si l'une de vos classes dépend d'une autre, et que vous compilez cette classe pour la première fois, le fichier sera compilé avec le nom correct en .java s'il ne trouve pas le fichier .class correspondant. Cependant, si vous éditez les deux fichiers en même temps, le fait de recompiler l'un des deux ne recompilera pas forcément l'autre.
L'une des solutions possibles est simplement de compiler tous les fichiers Java d'un dossier après chaque itération. Une autre méthode plus élégante serait d'écrire un fichier make de telle sorte que seuls les fichiers trop vieux soient compilés.
Le problème se complique pour les applets Java, étant donné que l'on passe par le chargeur de classe du navigateur. Si vous recompilez l'applet et ne faites que recharger la page, la classe en mémoire sera utilisée: il faut redémarrer le navigateur pour pouvoir prendre en compte la nouvelle classe.

7) Priorité de opérateurs
Lors d'instructions longues, on peut oublier les régles de priorité qui régissent Java. Ainsi, il faut se souvenir que les opérateurs sont évalué de gauche à droite dans l'ordre de priorité suivant (du plus prioritaire au moins):

 (...) puis [...]
 ++ , -- , ! , ! , ~ , new
 * , / , %
 + , -
 << , >> , >>>
 < , <= , >= , > , instanceof
 == , !=
 &
 ^
 |
 &&
 ||
 ? , :
 = , += , -= , *= , /= , %= , &=
 <<= , >>= , >>>= , ^= , |=
 ,

8) Ne pas réinventer la roue
Si le fait de travailler avec l'orientation Objet à l'esprit permet de construire un programme composé de plusieurs petites "briques" simples, indépendants et réutilisables, il risque aussi de vous faire coder des fonctions qui existent déjà en standard dans Java, soit par le biais de l'API Java, soit dans la bibliothèque de composants de l'entreprise. Bien connaître son environnement est la meilleure manière de ne pas perdre de temps en programmation inutile.

9) Gestion des exceptions
Le système de gestion de exceptions de Java est sophistiqué, mais difficile à conceptualiser d'entrée de jeu. Il ne devrait pas poser problème aux programmeurs venant du monde C++, mais ceux venant de C y verront peut-être une source de complications.
Par exemple, oublier de nommer l'exception provoquera une erreur (facilement réparable grâce au message du compilateur):

try
  {
  stream1 = new FileInputStream("donnees.txt");
  }
catch (IOException)
  {
  message("Impossible d'ouvrir data.txt");
  }

Il aurait fallu simplement ajouter "ie" : catch (IOException ie) { ... } .

L'ordre d'écriture de clauses catch dans un bloc try-catch défini un ordre de priorité pour les exceptions, mais chacun de ces clauses attrapera toutes les exceptions de la classe déclarée ou de n'importe quelle de ses sous-classes. Oublier cela peut amener à avoir des clauses qui ne sont jamais atteintes, ce que le compilateur Java traite comme étant une erreur sérieuse.

try
  {
  serviceSocket.setSoTimeout(1000);
  newsock = serviceSocket.accept();
  }
catch (IOException ie)
  {
  message("Erreur de connexion");
  }
catch (SocketException se)
  {
  message("Erreur de time-out");
  }

SocketException étant une sous-classe de IOException, le bon code serait:

try
  {
  serviceSocket.setSoTimeout(1000);
  newsock = serviceSocket.accept();
  }
catch (SocketException se)
  {
  message("Erreur de time-out");
  }
catch (IOException ie)
  {
  message("Erreur de connexion");
  }

10) Ne pas tester son code
Tous comme le fait de mettre des commentaires, tester son application peut sembler à certain être la démonstration d'un manque de confiance en ses capacités. Il n'en est évidemment rien: tester est bien au contraire la démonstration d'un désir de bien faire.
Plus généralement, il est de bon ton de glisser des tests au sein de son code: gestion des erreurs, des plantages du programme ou de la machine, des problèmes avec le système d'exploitation, les erreurs de disque et de fichier, vérification des messages envoyés par l'OS.
De même, faire des tests de performance ne fera que du bien à votre application: un programme ne peut pas toujours blâmer sa lenteur sur la machine sur laquelle il tourne, mais peut-être plutôt à un algorithme qui ralentirait l'ensemble du processus.
Le test devrait faire partie intégrante du processus de création: on ne teste pas à la fin, mais tout le long de l'écriture du code. Tester son code à la fin ne ferait que rendre impossible la possibilité de donner une estimation de date butoir, et ne permet pas de faire la différence entre un gros bug dans une fonction majeure ou un petit oubli dans une sous-fonction anodine.
Le test est le meilleur moyen de garder son code sous contrôle (cela permet de mieux connaître ses classes, par exemple), et permet de faire évoluer le code naturellement.

Tous ces conseils peuvent paraître évidents aux programmeurs chevronnés qui lisent cet article, mais certaines évidences ne sont-elles pas dues au fait que l'on est déjà passé par de telles erreurs ? Personne n'est à l'abri d'un déboguage, et nous espérons que cet article vous permettra d'augmenter encore votre rigueur de programmation.

Page 1 | 2

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page