Les exceptions
Principe général
Une exception permet d'interrompre un traitement lorsqu'une situation exceptionnelle se produit.
Une exception est propagée dans la pile des appels de méthodes. Elle peut être interceptée progammatiquement. Si elle n'est interceptée par aucune méthode, elle remonte la pile d'appel et interrompt le thread d'exécution. S'il s'agit du thread principal, le programme s'interrompt en erreur.
Déclaration et héritage
Les exceptions sont représentées par des classes qui ont comme ancêtre java.lang.Throwable
Les classes héritant de java.lang.Error sont réservées pour la JVM afin de signaler des erreurs systèmes :
- NoClassDefFoundError
- OutOfMemoryError
- StackOverflowError
- ...
Pour créer une exception, il suffit de créer sa propre classe en la faisant hériter de java.lang.Exception
.
Pour lancer une exception on utilise le mot-clé throw. On peut maintenant signaler l'événement exceptionnel de la fin du monde en lançant l'exception :
On distingue deux catégories d'exception : les checked exceptions et les unchecked exceptions
Les checked exceptions
Les checked exceptions doivent apparaître dans la signature des méthodes qui peuvent les lancer ou les propager lors d'un appel grâce au mot-clé throws.
Plusieurs checked exceptions peuvent être spécifiées en les séparant par une virgule :
Les unchecked exceptions
Les unchecked exceptions héritent directement ou indirectement de RuntimeException ou de Error.
La déclaration de ces exceptions est optionnelle dans la signature des méthodes pouvant les lancer ou les propager. D'où leur nom de unchecked qui signifie que leur propagation n'est pas vérifiée par le compilateur.
La syntaxe try-catch
Une exception peut être interceptée par une méthode dans la pile d'appel grâce à la syntaxe try-catch
:
Le block défini par le mot-clé catch est exécuté uniquement si une exception de type EndOfTheWorldException est lancée lors de l'exécution du block défini par le mot-clé try.
Un block défini par le mot-clé finally est exécuté systématiquement après un block try et un block catch (si une exception a été attrapée).
Un block finally est souvent utilisé en Java pour libérer des ressources système à la fin d'un traitement.
Depuis Java 7, on peut utiliser une expression try-with-resources. Pour gérer le cas particulier des resources que l'on souhaite fermer automatiquement.
Seules les classes implémentant l'interface java.lang.AutoCloseable ou java.io.Closeable peuvent être utilisées dans une expression try-with-resources.