Le compilateur (ou un environnement de développement comme Eclipse) pemet de détecter,
avant l'exécution, un certain nombre d'erreurs :
erreur de syntaxe,
affectation à une variable d'un objet de type incompatible,
etc.
Si ces erreurs en sont pas réglées, l'exécution du programme se sera pas permise.
D'autres erreurs peuvent se produire lors de l'exécution :
Même lorsqu'un programme est bien conçu, certains « plantages »
peuvent se produire : erreur de lecture/écriture dans fichier
(e.g. parce qu'un disque dur est défectueux, ou parce que le fichier est effacé pendant qu'on lit/écrit dedans),
connexion réseau interrompue,
construction d'une date par analyse d'une chaîne de caractère qui est au mauvais format, etc.
Les exceptions sont un mécanisme pour gérer ce type de cas.
Vous avez déjà probablement été confrontés à des exceptions lors de l'exécution de vos programmes :
Nous allons voir ici comment « gérer » ce type
d'exceptions (en les « interceptant »).
Vous en aurez notamment besoin si vous réalisez la partie "écriture des résultats dans un fichier" du projet
sur l'extraction des triplets syntaxiques".
Il est également possible de déclencher vous-même volontairement des exceptions
et de créer des classes qui dérivent de
Dans la documentation de l'API,
chaque méthode indique, lorsqu'il y a lieu, le type d'exception qu'elle peut générer (» lancer »).
Par exemple, si vous regardez la documentation de la classe
Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index >= size())
Cela signifie que, lorsque vous invoquez la méthode
Lorsqu'on sait qu'une instruction (ou plusieurs) peut déclencher une exception, on peut, en Java, spécifier les actions à mener le cas échéant. Il s'agit d'écrire un bloc try-catch. À l'intérieur du bloc (délimité par des accolades) try, on écrit l'instruction (ou les instructions) à risque puis, dans le bloc catch, les instructions à exécuter si l'erreur potentielle se produit. On peut :
ArrayList<Integer> listeEntiers = new ArrayList<Integer>(); try { System.out.println(listeEntiers.get(3)); } catch (IndexOutOfBoundException e) { System.out.println("Accès en dehors du tableau. Fin du programme."); System.exit (-1); } System.out.println ("On continue le programme");
Ici, si l'exécution de la méhode
Dans certaines situations, vous n'êtes pas obligés d'intercepter les exceptions. Pour d'autres, Java vous l'impose. Ce sera le cas lors du travail avec les fichiers.
L'objet
ArrayList<Integer> listeEntiers = new ArrayList<Integer>(); try { System.out.println(listeEntiers.get(3)); } catch (IndexOutOfBoundException erreur) { System.out.println("Accès en dehors du tableau."); System.out.println("Trace d'exécution :"); erreur.printStackTrace (); System.out.println("On continue le programme..."); } System.out.println ("Suite du programme");
Lorsqu'une ou plusieurs instructions peuvent déclencher des exceptions de types différents,
on peut exécuter des traitements différenciés.
Par exemple, la méthode (statique)
ArrayList<Integer> listeEntiers = new ArrayList<Integer>(); listeEntiers.add (new Integer (1)); listeEntiers.add (new Integer (-27)); try { System.out.println(Integer.parseInt ("123ZY")); System.out.println(listeEntiers.get(3)); } catch (IndexOutOfBoundException erreurIndex) { System.out.println("Accès en dehors du tableau."); erreurIndex.printStackTrace(); } catch (NumberFormatException erreurFormatNb) { System.out.println("Mauvais format d'entier"); erreurFormatNb.printStackTrace (); } System.out.println ("Suite du programme");
Ici, le fait d'avoir deux blocs catch (notez que dans ce cas, on nomme différemment
l'objet correspondant à l'exception interceptée, ici :
Il est également possible de proposer un traitement identique pour toutes les exceptions
potentielles en interceptant une instance de la classe-mère
ArrayList<Integer> listeEntiers = new ArrayList<Integer>(); listeEntiers.add (new Integer (1)); listeEntiers.add (new Integer (-27)); try { System.out.println(Integer.parseInt ("123ZY")); System.out.println(listeEntiers.get(3)); } catch (Exception e) { System.out.println("Une erreur s'est produite."); e.printStackTrace(); } System.out.println ("Suite du programme");