Vous êtes sur la page 1sur 22

CHAPITRE EXCEPTIONS

Quest ce quune exception ?

Les exceptions reprsentent le mcanisme de gestion des erreurs intgr au langage Java. Il se compose d'objets reprsentant les erreurs et d'un ensemble de trois mots cls qui permettent de dtecter et de traiter ces erreurs ( try, catch et finally ) et de les lever ou les propager (throw et throws).

Traitement dune exception

Lors de la dtection d'une erreur, un objet qui hrite de la classe Exception est cr (on dit qu'une exception est leve) et propag travers la pile d'excution jusqu' ce qu'il soit trait. Si une exception remonte jusqu la mthode main() sans tre traite, la JVM
stoppe lexcution du programme
affiche un message derreur, avec une description de la pile des mthodes traverses par lexception

Exemple : une exception leve l'excution et non capture


public class TestException { public static void main(java.lang.String[] args) { int i = 3; int j = 0; System.out.println("rsultat = " + (i / j)); } }

Rsultat :

C:>java TestException Exception in thread "main" java.lang.ArithmeticException: / by zero at tests.TestException.main(TestException.java:23)

Les exceptions en Java

Si dans un bloc de code on fait appel une mthode qui peut potentiellement gnrer une exception, on doit :
soit essayer de la rcuprer avec try/catch, soit ajouter le mot cl throws dans la dclaration du bloc. !!! Sinon erreur la compilation !!!.

Les erreurs et exceptions du paquetage java.lang chappent cette contrainte.


6

Les exceptions en Java

inconvnient :
nombreuses mthodes des packages java indiquent dans leur dclaration qu'elles peuvent lever une exception.
Cependant ceci garantie que certaines exceptions critiques seront prises explicitement en compte par le programmeur.

Les mots cls try, catch et finally

Le bloc try rassemble les appels de mthodes susceptibles de produire des erreurs ou des exceptions.
operation_risque1;

try {

opration_risque2;
} catch (ExceptionInteressante e) { traitements }

catch (ExceptionParticulire e) {
catch (Exception e) {

traitements }

traitements }

finally {
traitement_pour_terminer_proprement; }
8

Toute exception leve dans le bloc try est abandonne au premier bloc catch qui la traite. S'il y a plusieurs types d'erreurs et d'exceptions intercepter, il faut dfinir autant de bloc catch que de type d'vnement. !!!ordre important des clauses catch!!! traiter en premier les exceptions les plus prcises (sous classes) avant les exceptions plus gnrales.
Sinon erreur de compilation (catch not reached).9

Si l'exception n'est pas trait par un bloc catch, elle sera transmise au bloc de niveau suprieur. Si l'on ne se trouve pas dans un autre bloc try, on quitte la mthode en cours, qui rgnre son tour une exception dans la mthode appelante.
La clause finally dfinit un bloc qui sera toujours excut, qu'une exception soit leve ou non. Ce bloc est facultatif. Il est aussi excut si dans le bloc try il y a une instruction break ou continue.
10

Exemples de traitements dans un bloc catch

Fixer le problme et ressayer le traitement qui a provoqu le passage au bloc catch Faire un traitement alternatif
Retourner (return) une valeur particulire Sortir de lapplication avec System.exit()

Faire un traitement partiel du problme et relancer (throw) la mme exception (ou une autre exception) 11

La classe Throwable

classe de base pour le traitement des erreurs. Constructeurs :


Throwable(), Throwable(String)

Mthodes de la classe :
String getMessage( ) lecture du message void printStackTrace( ) affiche l'exception et l'tat de la pile d'excution au moment de son appel
12

Exemple
public class TestException {
public static void main(java.lang.String[] args) {

// Insert code to start the application here.


int i = 3; int j = 0;

C:>java TestException getmessage / by zero


toString java.lang.ArithmeticException: / by zero

try { System.out.println("rsultat = " + (i / j)); } printStackTrace java.lang.ArithmeticException: / by zero catch (ArithmeticException e) { at System.out.println("getmessage"); tests.TestException.main(TestException.java:2 System.out.println(e.getMessage()); 4) System.out.println(" ");

System.out.println("toString");
System.out.println(e.toString()); System.out.println(" "); System.out.println("printStackTrace"); e.printStackTrace();

}}
}

13

Hirarchie dexceptions
Throwable

Error

Exception

Erreur grave

RuntimeException

Exceptions contrles

Exceptions prdfinies dans les paquettages JDK

Exceptions dfinies par le programmeur

14

Hirarchie dexceptions

Il existe trois types d'exceptions :


Error : ces exceptions concernent des problmes lis l'environnement. Elles hritent de la classe Error (exemple : OutOfMemoryError) RuntimeException : ces exceptions concernent des erreurs de programmation qui peuvent survenir de nombreux endroits dans le code (exemple : NullPointerException). Elles hritent de la classe RuntimeException Checked exception : ces exceptions doivent tre traites ou propages. Toutes les exceptions qui n'appartiennent pas aux catgories prcdentes sont de ce type
15

Quelques sous-classes de RuntimeException


NullPointerException IndexOutOfBoundsException et sa sous-classe ArrayIndexOutOfBoundsException ArithmeticException IllegalArgumentException et sa sous-classe NumberFormatException ClassCastException NoSuchElementException

16

Exception contrle et non contrle

Java n'oblige la dclaration des exceptions dans l'en tte de la mthode que pour les exceptions dites contrles (checked). Les exceptions non contrles (unchecked) peuvent tre captures mais n'ont pas tre dclares.
Les exceptions et erreurs qui hritent de RunTimeException et de Error sont non contrles. Toutes les autres exceptions sont contrles.

17

Les exceptions personnalises

Pour gnrer une exception, il suffit d'utiliser le mot cl throw, suivi d'un objet dont la classe drive de Throwable. Si l'on veut gnrer une exception dans une mthode avec throw, il faut l'indiquer dans la dclaration de la mthode, en utilisant le mot cl throws. En cas de ncessit, on peut crer ses propres exceptions.
Sous classe de Exception ou RuntimeException
18

Exemple 1 : Lancer une exception du JDK


public class Compte{
. . .

public void setSolde(double solde) { if (solde>= 0) this.solde = solde; else throw new IllegalArgumentException("Solde ngatif !");
} . . .

Cration dune instance

Faite de mme dans le constructeur de la classe compte pour ne pas dpasser le nombre max de compte
19

Exemple 2 : Lancer sa propre exception


public class SaisieErroneeException extends Exception {
public SaisieErroneeException() {

super();
} public SaisieErroneeException(String s) { super(s); }

20

Exemple 2 (suite)
public class TestSaisieErroneeException {
public static void controle(String chaine) throws SaisieErroneeException { if (chaine.equals("") == true) throw new SaisieErroneeException("Saisie erronee : chaine vide"); } public static void main(java.lang.String[] args) { String chaine1 = "bonjour"; String chaine2 = ""; try { controle(chaine1); } catch (SaisieErroneeException e) { System.out.println("Chaine1 saisie erronee"); }; try { controle(chaine2); } catch (SaisieErroneeEx ception e) { System.out.println("Chaine2 saisie erronee"); }; }}

21

Les mthodes pouvant lever des exceptions doivent inclure une clause throws nom_exception dans leur en tte.
prciser au compilateur que cette mthode pourra lever cette exception et que toute mthode qui l'appelle devra prendre en compte cette exception (traitement ou propagation).
22

Vous aimerez peut-être aussi