Algorithmique et langage Java

Traitement des exceptions

Des erreurs peuvent se produire lors de l'exécution d'un programme parce que les choses ne se passent pas comme le programmeur l'avait prévu : l'utilisateur du programme ne rentre pas les bonnes valeurs, une ressource nécessaire au programme est introuvable....

Il est nécessaire de gérer ces imprévus (appelés "exceptions", pour éviter qu'ils ne causent le blocage ou l'arrêt du programme.

Les instructions try...catch.. et try...catch..finally permettent de gérer ce qu'on appelle des "exceptions".


Par exemple
class Perroquet
{
  public static void main(String[] args)
  {
    String phrase="";
    int i=0;
    do  
   {
      phrase=phrase+args[i]+" ";
	  i++;
    }
    while (i<args.length);	  
    System.out.println("Tu as dit \" " + phrase+"\"");
  }
}

Compilez et lancez ce programme sans paramètres : cela provoque une erreur.
La JVM signale :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at Perroquet.main(Perroquet.java:7)
Cette longue phrase signifie qu'une erreur due à un index de tableau hors limite s'est produite :en effet, tel que le programme est écrit, il essaie d'accéder au premier élément de args sans avoir préalablement vérifié que args avait une longueur non nulle.

Lors de l'exécution le programme a donc déclenché une exception de type ArrayIndexOutOfBoundsException , puis il s'est arrêté.

On peut mettre à profit la survenue de cette exception pour traiter l'erreur. On écrira

class Perroquet
{
  public static void main(String[] args)
  {
    String phrase="";
    try
    {
      int i=0;
      do  
	  {
        phrase=phrase+args[i]+" ";
	    i++;
	  }
      while (i<args.length);	  
      System.out.println("Tu as dit \" " + phrase+"\"");
    }
    catch(java.lang.ArrayIndexOutOfBoundsException erreur)
	{
      System.out.println("Erreur : pas d'arguments trouvés");
    }
    System.out.println("suite et fin du programme");
  }
}

Les instructions qui risquent de déclencher l'exception sont entourées d'accolades et précédées de "try" : ainsi la JVM essaiera d'exécuter ces instructions.
Mais si cela déclenche une exception, plutôt que d'arrêter le programme, elle cherche si l'exception peut être "attrapée" : c'est le rôle du bloc d'instructions

catch(java.lang.ArrayIndexOutOfBoundsException erreur) )
{
  System.out.println("Erreur : pas d'arguments trouvés");
}
signalé par le mot clé catch suivi entre parenthèses du type de l'exception attrapé (ici java.lang.ArrayIndexOutOfBoundsException) et de l'indentifiant de celle-ci (choisi par le programmeur, ici "erreur").

L'exécution du programme sans paramètre déclenche une exception qui interrompt l'exécution du bloc try et provoque l'exécution du bloc catch.... Le programme n'est pas interrompu en cas d'erreur de dépassement d'index.

Il peut cependant toujours se produire d'autres exceptions de nature différente.Pour finir le programme "proprement" même en cas d'exceptions non traitées, on utilise un bloc introduit par l'instruction finally, qui indique ce qui doit être fait de toutes façons, exceptions ou non (par exemple, fermer un fichier qu'on a ouvert, et qui risquera sinon d'être rendu inaccessible).

Par exemple
class Perroquet
{
  public static void main(String[] args)
  {
    String phrase="";
    try
	{
      int i=0;
      do  
	  {
        phrase=phrase+args[i]+" ";
 	      i++;
	  }
      while (i<args.length);	  
      System.out.println("Tu as dit \" " + phrase+"\"");
    }
    catch(java.lang.ArrayIndexOutOfBoundsException er)
	{
      System.out.println("Erreur : pas d'arguments trouvés");
    }
    finally
	{
      System.out.println("suite et fin du programme");
    }
  }
}

Un bloc try peut être suivi de plusieurs blocs catch, chacun traitant un type d'exception n'ayant pas été géré par les précédents.

Certaines méthodes sont intrinsèquement susceptibles de provoquer des exceptions, notamment celles qui interagissent avec des fichiers ou le matériel, qui peuvent être absents ou défectueux. Dans ce cas il est obligatoire de prévoir la gestion de ces exceptions, sans cela le programme ne pourra être compilé. Si le code ne gère pas l'exception on obtient lors de la tentative de compilation un message d'erreur "unreported exception ....;must be caught or declared to be thrown".

La méthodeInteger.valueOf(String s) , qui permet de convertir une chaine de caractère en la valeur entière correspondante, déclenche une exception de type java.lang.NumberFormatException si la chaine s passée en paramètre ne représente pas un entier.
Ecrivez un programme qui utilise ConsoleTexte et l'instruction getDonnees() pour obtenir une chaîne de caractère fournie par l'utilisateur, puis qui tente de convertir la chaine saisie en entier. Utilisez un try... catch pour gérer l'exception java.lang.NumberFormatException qui risque de se produire.
 
Licence Creative Commons
licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé
Auteur : Nathalie Bonnin
Professeur de Physique, Chimie, Informatique au lycée La Martinière Monplaisir (Lyon 8ème)
Contact :
nathalie.bonnin (chez) scientillula.net
Licence Creative Commons
La totalité du contenu du site Scientillula.net appartient à Nathalie Bonnin et est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé