Exemple 106. Déclenchement d'exceptions par la JVM
// Exemple 1 int i = 0 ; int j = 0 ; int k = i / j ; // déclenche une java.lang.ArtithmeticException // Example 2 String bonjourLeMonde = null ; int l = s.length() // déclenche la célèbre java.lang.NullPointerException // Example 3 int [] quelquesEntier = new int [] { 3, 1, 4, 1, 5, 9 } ; int k = quelquesEntier[1000] ; // déclenche java.lang.IndexOutOfBoundsException
Exemple 107. Déclenchement manuel d'une exception
if (temperature > 40) { throw (new Exception("Il fait trop chaud !")) ; }
throw
fait partie des mots-clés réservés du langage Java, et il permet de forcer la génération d'une exception, représentée par l'objet qu'on lui passe en paramètre.
Si une méthode porte en elle le déclenchement, même conditionnel, d'une exception, elle doit le déclarer dans sa signature. C'est le cas par exemple de la plupart des méthodes des classes qui gèrent les fichiers. La classe
FileReader
, qui permet de lire des fichiers, déclare par exemple l'exception suivante :
public FileReader(String fileName) throws FileNotFoundExceptionCette exception est déclarée sur le constructeur (ce qui est parfaitement légal). Si l'on tente de construire une instance de
FileReader
en fournissant un nom de fichier qui n'existe pas, notre objet ne sera pas construit, et une exception du type
FileNotFoundException
sera générée.
On notera la différence entre la génération manuelle d'une exception qui utilise le mot-clé
throw
(sans
s
), et la déclaration au niveau de la signature d'une méthode, qui utilise le mot-clé
throws
(avec un
s
).
Dire que la déclaration des exceptions fait partie de la signature d'une méthode est un abus de langage : en toute rigueur, elle n'en fait pas partie.
Notons enfin que l'on peut également générer manuellement des
runtime exception
. Ces exceptions n'ont pas à être déclarées avec la signature de la méthode.
Dans un programme Java, toute exception jetée explicitement doit être soit propagée vers la méthode appelante, soit traitée localement.
La propagation d’une exception se fait simplement dans la déclaration de la méthode, comme dans l’exemple suivant.
Exemple 108. Propagation d'un exception
public void jeLisUnFichier(String nomDeFichier) throws FileNotFoundException { FileReader = new FileReader(nomDeFichier) ; }
FileReader
est propagée à la méthode appelante, qui pourra elle-même la traiter ou la propager. Il est possible de déclarer autant d'exceptions que l'on veut dans une clause
throws
.
Il est également possible de déclarer tout objet ancêtre des exceptions jetées, tel que
Exception
ou même
Throwable
. Cette façon de faire n'est toutefois pas très astucieuse, dans la mesure où le type de l'exception jetée porte l'information de l'erreur qui a été rencontrée.
String
StringBuffer
et
StringBuilder