Introduction aux exceptions en Java
Exemples de code avec gestion des exceptions
Créer ses propres exceptions
Instruction try/catch/finally
java.lang.Error et java.lang.RuntimeException
Avantages liés aux exceptions
Qu’est-ce qu’une exception en Java?
Définition
Une exception est un événement, se produisant lors de l’exécution d’un programme, qui interrompt l’enchaînement normal des instructions..
L’objet Exception
Lorsqu’une erreur se produit dans une méthode, celle-ci crée un objet
Exception qui contient des informations sur l’erreur survenue :
le type de l’erreur : objet null, dépassement de tableau, etc.
la trace d’exécution du programme : la stack trace
L’action de créer un objet Exception et de le passer au système d’exécution est appelée lever/lancer une exception (throwing an exception)
Gestion d’une exception
Récupération de l’exception
Lorsqu’une exception est levée, le système d’exécution tente de trouver un handler pour cette exception : c-à-d. une méthode pouvant la gérer.
Pour cela, il cherchera dans les méthodes qui ont été appelées jusqu’à l’exception : the call stack (la pile d’appels)
Recherche dans la call stack
Le système d’exécution va donc chercher dans la call stack une méthode contenant un bout de code capable de gérer l’exception levée.
Ce bout de code est appelé exception handler.
La recherche commence par la méthode où l’erreur est apparue.
Cette recherche continue dans l’ordre inverse des méthodes contenues dans la call stack jusqu’à trouver un exception handler approprié.
Un exception handler est approprié s’il est capable de gérer le type d’exception renvoyé.
Si un exception handler approprié est trouvé, on dit qu’il attrape l’exception : catch the exception. Sinon, le programme s’arrête en affichant les informations associées à l’exception : type et stack trace (enchaînement des appels de méthode).
Le « Catch or specify requirement »
Du code Java valide doit nécessairement inclure la gestion des exceptions et respecter ainsi le Catch or specify requirement :
Tout code susceptible de renvoyer une exception doit être contenu soit :
dans une instruction try/catch qui définit ainsi le handler approprié.
dans une méthode spécifiant explicitement qu’elle peut renvoyer une exception : il faut inclure le mot clé throws, suivi du type d’exception renvoyée, dans la signature de la méthode.
Exemple : public void setAge(int age) throws NegativeAgeException
DU CODE NE RESPECTANT PAS CETTE RÈGLE NE COMPILE PAS !
Solution 1 : gestion active avec try/catch
Solution 1 : try/catch
package prog ;
impor t java . i o . F i l eWr i t e r ; impor t java . i o . Pr i n tWr i t e r ;
impor t java . i o . IOExcept ion ; / / I l f au t impor ter l a classe de l ’ except i
pub l i c c lass Test ingExcept ions {
pub l i c void wr i t eF i l eTes t i ng ( ) {
Pr i n tWr i t e r out = nu l l ;
t r y {
out = new Pr i n tWr i t e r ( new F i l eWr i t e r ( » OutFi le . t x t » ) ) ;
} catch ( IOExcept ion e ) {
System . out . p r i n t l n ( » er reur ouver ture f i c h i e r » ) ;
e . pr intStackTrace ( ) ; / / af f i chage de l a c a l l stack pour debugger
}
i f ( out != nu l l ) { / / i l est preferab l e de v e r i f i e r
out . p r i n t ( » t es t » ) ;
}
}
}
Cours Java – F. Miche
Le constructeur de la classe java.io.PrintWriter est susceptible, par définition (cf. api), de renvoyer une exception du type java.io.IOException. C’est pourquoi le code suivant ne peut pas être compilé. Il ne respecte pas le catch or specify requirement !
Exemple de code erroné
package prog ;
impor t java . i o . F i l eWr i t e r ; impor t java . i o . Pr i n tWr i t e r ;
pub l i c c lass Test ingExcept ions {
pub l i c void wr i t eF i l eTes t i ng ( ) {
Pr i n tWr i t e r out = new Pr i n tWr i t e r ( new F i l eWr i t e r ( » OutFi le . t x t » ) ) ;
out . p r i n t ( » t es t » ) ;
}
}
Solution 2 : throws dans la signature
package prog ;
impor t java . i o . F i l eWr i t e r ; impor t java . i o . Pr i n tWr i t e r ;
impor t java . i o . IOExcept ion ;
pub l i c c lass Test ingExcept ions {
pub l i c void wr i t eF i l eTes t i ng ( ) throws IOExcept ion {
Pr i n tWr i t e r out = new Pr i n tWr i t e r ( new F i l eWr i t e r ( » OutFi le . t x t » ) ) ;
out . p r i n t ( » t es t » ) ;
}
Remarque:
Préférez la solution 1. Il est toujours plus sûr de gérer soi-même les exceptions. Ici la gestion est déléguée à la méthode appelante.
…
Langage Java (399 KO) (Cours PDF)