Vous êtes sur la page 1sur 50

PARTIE V

LES
EXCEPTIONS
La gestion des erreurs, vue de Java…
Contenu
1. Introduction - Généralités
2. Capture des exceptions - le bloc try catch
3. Déclenchement des exceptions – throws – throw
4. Les exceptions contrôlées
5. Les exceptions non contrôlées
6. Le mécanisme « try-with-resources »
7. Les exceptions personnalisées
8. Applications

GHISLAIN AKINOCHO - LPTI-3-DAR - ESMT - 19/20 2


LES EXCEPTIONS
Généralités
■ Des événements exceptionnels peuvent survenir lors de
l'exécution d'un programme et interrompre son exécution.

– Division par zéro,

– Dépassement de mémoire,

– format de données incorrect,

– ouverture d’un fichier inexistant, etc …


LES EXCEPTIONS
Généralités
■ Il est tout à fait possible de faire une analyse permettant
d’identifier toutes les situations susceptibles de produire des
erreurs et de les traiter.

– Cette approche est très peu interressante


■ Certains cas peuvent être omis

■ Avec les multiples contrôles ça et là, le code source peut


devenir illisible et rendre difficile la maintenance de
l’application
LES EXCEPTIONS
Généralités
■ Java propose un mécanisme plus élégant et plus efficace :
– La gestion des exceptions
■ Les erreurs et leur détection sont gérés avec des objets
spéciaux appelés exceptions.

■ Classe : java.lang.Exception

– Les erreurs en java sont donc des objets de type


Exception
LES EXCEPTIONS
Généralités
■ Lorsqu’une exception se produit, le flux normal du programme
est interrompu et le programme ou l’application se termine de
manière anormale et brutale.

■ Ce qui n’est absolument pas recommandé !!!


– Par conséquent, les exceptions doivent être traitées.
CAPTURE DES
EXCEPTIONS
Le bloc try … catch
LES EXCEPTIONS
Le bloc try { } catch () …
■ La gestion des erreurs en Java se déroule en deux étapes …

1. Détection de l’erreur
■ Création / Instanciation d’un traitant d’erreur approprié pour la
prise en charge.
■ D’où la nécessité d’un dispositif de capture d’erreur :
■ le bloc try { } catch ( ) …

2. Traitement de l’erreur
■ Consiste à effectuer une action spéciale pour permettre au
programme de poursuivre son traitement comme s’il n’y avait pas
eu de problème.
LES EXCEPTIONS
Le bloc try { } catch () …
■ Quand une erreur survient lors de l’exécution d’un programme Java,
la JVM crée automatiquement un objet de type Exception qui
représente l’erreur et son diagnostic.

■ Par défaut, elle affiche dans la fenêtre de commandes un diagnostic


de la forme :
Exception in thread "main" ClasseException: MessageException

■ où
– ClasseException est la classe de l’objet exception
déclenchée suite à l’erreur et
– MessageException son message associé
LES EXCEPTIONS
Le bloc try { } catch () …
■ Il faut intercepter l’exception qu’une méthode déclenche et la traiter
avec une instruction try { } catch () respectant la syntaxe
suivante :

try {

/* InstructionsTry */

} catch (ClasseException e) {

/* InstructionsCatch */

}
LES EXCEPTIONS
Le bloc try { } catch () …
Essayer …  try {
d’exécuter InstructionsTry  /* InstructionsTry */
Et si une exception de la Classe  } catch ( ClasseException e) {
ClasseException a été déclenchée lors
de l’exécution de InstructionsTry,
InstructionsCatch est exécuté.  /* InstructionsCatch */
}

Quand une exception est déclenchée par une instruction du bloc try, la JVM recherche le bloc
catch de même classe que celle de l’exception. Si ce bloc existe :

 L’exception est interceptée par le bloc catch. La référence e désigne l’exception.

 Les instructions du bloc catch sont exécutées

 Les instructions suivant l’instruction try catch sont exécutées en oubliant celles qui suivent
l’instruction qui a provoqué l’exception dans le bloc try.
LES EXCEPTIONS
Le bloc try { } catch () …
■ Exemple (code source) :

package exception;

import esmt.formation.java.io.Clavier ;

public class ExceptionDemo {

public static void main ( String[] args ) {

double [] tableau = { 1.2, 5 } ;


int ind ;

System.out.println ( "Entrez l'indice de la cellule : " ) ;


ind = Clavier.lireInt() ;
System.out.println ( "tableau [" + ind + "] = " + tableau [ind] ) ;
}
}
LES EXCEPTIONS
Le bloc try { } catch () …
■ Exemple (exécution) :
LES EXCEPTIONS
Le bloc try { } catch () …
■ Exemple (code source) : solution 1 – par contrôle
package exception;
import esmt.formation.java.io.Clavier ;

public class ExceptionDemo {


public static void main(String[] args) {

double [] tableau = { 1.2, 5 } ;


int ind ;

System.out.println ( "Entrez l'indice de la cellule : " ) ;


ind = Clavier.lireInt() ;

if ( ind >= 0 && ind < 2 ) {


System.out.println ( "tableau [" + ind + "] = " + tableau [ind] ) ;
} else {
System.err.println ( "Indice incorrect !" );
}
}
}
LES EXCEPTIONS
Le bloc try { } catch () …
■ Exemple (exécution) : solution 1 – par contrôle
LES EXCEPTIONS
Le bloc try { } catch () …
■ Exemple (code source) : solution 2 – par les exceptions

package exception;
import esmt.formation.java.io.Clavier ;

public class ExceptionDemo {


public static void main ( String[] args ) {

double [] tableau = { 1.2, 5 } ;


int ind ;

System.out.println ( "Entrez l'indice de la cellule : " ) ;


try {
ind = Clavier.lireInt () ;
System.out.println ( "tableau [" + ind + "] = " + tableau [ind] ) ;
} catch ( ArrayIndexOutOfBoundsException e ) {
System.err.println ( "Indice Incorrect : " + e.getMessage() ) ;
}
}
}
LES EXCEPTIONS
Le bloc try { } catch () …
■ Exemple (exécution) : solution 2 – par les exceptions
LES EXCEPTIONS
Multiple catch blocks
■ Autant de bloc catch que d’interceptions possibles
■ Un bloc try peut être suivi de plusieurs blocs catch. La syntaxe
de plusieurs blocs catch ressemble à ceci :
try {
// Code suspect ...
// Susceptible de générer des exceptions ...

} catch (ExceptionType1 e1) {


// Traitement de l'exception ExceptionType1

} catch (ExceptionType2 e2) {


// Traitement de l'exception ExceptionType2

} catch (ExceptionType3 e3) {


// Traitement de l'exception ExceptionType3
}
LES EXCEPTIONS
Multiple catch blocks
■ Depuis Java 7, il est possible de gérer plusieurs exceptions en
utilisant un seul bloc catch, cette fonctionnalité simplifie le code.

try {
// Code suspect ...
// Susceptible de générer des exceptions ...

} catch (ExceptionType1 | ExceptionType2 ex) {


// Traitement de l'exception déclenchée parmi les deux …
}
LES EXCEPTIONS
Le bloc finally
■ Une instruction try catch peut être suivie d’un bloc finally
contenant les instructions qu’il faut toujours exécuter, après
qu’une partie ou toutes les instructions du bloc try ont été
exécutées.

■ Par exemple, un bloc try qui traite des accès à un fichier


(ouverture, écriture) est généralement suivi d’un bloc finally
fermant le fichier.

■ Le fichier sera ainsi finalement fermé, qu’une exception ait été


déclenchée ou non dans le bloc try.
LES EXCEPTIONS
Le bloc finally
package exception;

public class FinallyExemple { Démo - source

public static void main(String[] args) {


int myArray [] = new int [2] ;

try {
System.out.println ( "Acces à l'élément d'indice 3 "
+ "du tableau : " + myArray[3] ) ;

} catch (ArrayIndexOutOfBoundsException e) {
System.out.println ( "Crash du programme : " + e );

} finally {
System.out.println ( "Bloc finally exécuté systématiquement"
+ " (erreur ou pas)!" ) ;
}
}
}
LES EXCEPTIONS
Le bloc finally
Démo – runtime – une erreur s’est produite – elle a été capturée et traitée – le bloc
finally est exécuté.

Démo – runtime – aucune erreur ne s’est produite - le bloc finally est toujours exécuté.
DÉCLENCHER
UNE EXCEPTION
Les clauses throw et throws
LES EXCEPTIONS
déclencher les exceptions : throw
■ L’instruction throw suivie d’une instance d’une classe d’exception permet
de déclencher une exception.

■ Utilisée dans une méthode ou dans un constructeur, elle provoque l’arrêt


de la méthode ou du constructeur courant sans retourner la valeur.

■ La JVM remonte alors la pile d’exécution à la recherche d’un bloc catch


capable d’intercepter l’exception déclenchée.

■ S’il n’existe aucune instruction try catch à même de traiter cette classe
d’exception, la JVM arrête la tâche courante et affiche dans la fenêtre de
commandes le diagnostic de l’exception.
LES EXCEPTIONS
déclencher les exceptions : throw
package exception;
Exemple d’une méthode qui vérifie l’éligilité
d’un individu.
import esmt.formation.java.io.Clavier;
Déclenche une exception si l’argument
n’est pas valide.
public class ThrowExemple {

public static void main(String[] args) {


int age = Clavier.lireInt( "Entrez votre age svp : " ) ;
validate ( age ) ;
System.out.println ( "Suite du programme ..." );
}

private static void validate ( int age ) {


if ( age < 18 ) {
throw new IllegalArgumentException ( "Non éligible : " + age ) ;
} else {
System.out.println ( "OK. Eligible ! Bonne chance !" );
}
}
}
LES EXCEPTIONS
déclencher les exceptions : throw
Runtime
L’exécution déclenche cette fois une Exception de type
IllegalArgumentException … qu’il faudra traiter …

Le programme est brutalement interompu.


LES EXCEPTIONS
déclencher les exceptions : throw
Pour traiter cette exception, il faut modifier la méthode main ainsi en ajoutant le
bloc try catch …

public static void main(String[] args) {


int age = Clavier.lireInt ( "Entrez votre age svp : " ) ;

try {
validate ( age ) ;
} catch ( IllegalArgumentException e ) {
System.err.println ( "an error occurred : " + e.getMessage() );
}

System.out.println ( "Suite du programme ..." );


}
LES EXCEPTIONS
déclencher les exceptions : throw
Runtime
L’exécution déclenche une Exception de type IllegalArgumentException …
qui est traité et le programme se poursuit normalement.
LE CONTRÔLE
DES EXCEPTIONS
Les exceptions contrôlées
Les exceptions non contrôlées
LES EXCEPTIONS
contrôlées (checked)
non controlées (unchecked)
■ Certaines des exceptions sont provoquées :
– par une erreur de l'utilisateur,
– d'autres par une erreur du programmeur et
– d'autres par des ressources physiques en panne.

■ Sur cette base, deux catégories d'exceptions se distinguent.


– Exceptions contrôlées
■ Les classes dérivées de java.lang.Exception, différentes de
java.lang.RuntimeException et de ses sous-classes, sont des
classes d’exception contrôlées.

– Exceptions non contrôlées


■ Les sous-classes de java.lang.Error et
java.lang.RuntimeException ne sont pas contrôlées par le
compilateur.
LES EXCEPTIONS
contrôlées (checked)
non controlées (unchecked)
■ Les classes
– java.lang.Error,
– java.lang.Exception et
– java.lang.RuntimeException,

■ sous-classes de java.lang.Throwable, définissent des


catégories d’exceptions différentes
LES EXCEPTIONS
contrôlées (checked)
non controlées (unchecked)
java.lang

Object

Throwable Error

Exception

RuntimeException Autres Exceptions

Figure - Hiérarchie des classes d’exceptions


LES EXCEPTIONS
contrôlées (checked)

■ Les exceptions contrôlées sont des exceptions dont le compilateur vérifie la


bonne prise en charge dans les classes au moment de la compilation.
– Elles ne peuvent pas être simplement ignorées, le programmeur devra
s’occuper de (gérer) ces exceptions.
– Les classes d’exception contrôlées les plus fréquemment utilisées sont
déclenchées par les méthodes d’entrée/sortie.

■ Par exemple :
– L’utilisation de la classe FileReader dans un programme pour lire les
données d'un fichier déclenche une exception de la classe
FileNotFoundException quand le fichier spécifié dans son constructeur
n'existe pas.
– Le compilateur invite donc le programmeur à gérer cette exception.
LES EXCEPTIONS
contrôlées (checked)

■ Du fait qu’elles sont susceptibles de se produire, le compilateur contraint ainsi le


développeur à les gérer systématiquement pour rendre les classes du
programme plus robustes dès leur conception.

– java.io.IOException et ses sous-classes pour les erreurs


d’entrée/sortie sur les fichiers et le réseau.

– java.sql.SQLException et ses sous-classes pour les erreurs avec une


base de données

– java.servlet.ServletException pour les erreurs avec les servlets.


LES EXCEPTIONS
contrôlées (checked)

■ Pour la gestion des exceptions contrôlées, le compilateur offre deux choix :

– Soit d’intercepter l’exception contrôlée dans un bloc try {} catch,

– Soit de la laisser se propager dans la pile d’exécution en ajoutant la classe


de l’exception à la clause throws de la méthode à risque.
LES EXCEPTIONS
contrôlées (checked)
Démo : La classe d’exception
CloneNotSupportedException est une classe
d’exception controlée
LES EXCEPTIONS
non contrôlées (unchecked)

■ Le compilateur n’oblige pas à traiter toutes les instructions dans des try
catch en prévision de toutes les exceptions qui pourraient être
déclenchées ; ça serait fastidieux.

■ Les exceptions non contrôlées sont celles pour lesquelles le compilateur


n’impose leur prise en charge par le programmeur.

■ Si une exception de ce type est déclenchée lors de l’exécution, soit


– elle a été prévue et traitée avec une instruction try catch dans le
programme,
– soit la JVM affiche le diagnostic correspondant et le développeur corrige
l’erreur dans le programme.
LES EXCEPTIONS
non contrôlées (unchecked)
Sous-classe Description
java.lang.ArithmeticException Division par zéro

java.lang.ClassCastException Conversion d’une référence dans un type


incompatible
java.lang.IllegalArgumentException Valeur refusée en paramètre d’une méthode

java.lang.NumberFormatException Sous-classe de la précédente utilisée par les


méthode parse… des classes d’emballage
numériques si une chaîne de caractères n’est
pas convertible dans son type primitif
correspondant.
java.lang.IllegalStateException Etat d’un objet n’autorisant pas l’appel d’une
méthode
Tableau – Les sous-classes de java.lang.RuntimeException
les plus fréquemment utilisées (1/2)
LES EXCEPTIONS
non contrôlées (unchecked)
Sous-classe Description
java.lang.IndexOutOfBoundsException Valeur d’indice en dehors des limites
autorisées
java.lang.ArrayIndexOutOfBoundsException Sous-classe utilisée pour les indices des
tableaux
java.lang.StringIndexOutOfBoundsException Sous-classe utilisée pour les indices dans
les chaînes de caractères
java.lang.NullPointerException Appel d’une méthode ou utilisation d’un
champ avec une référence null.
java.lang.SecurityException Violation de sécurité.

java.lang.UnsupportedOperationException Opération non supportée par une


méthode.

Tableau – Les sous-classes de java.lang.RuntimeException


les plus fréquemment utilisées (2/2)
LES EXCEPTIONS
Méthodes usuelles
Méthode Description
public String getMessage () Renvoie un message détaillé sur l'exception qui
s'est produite.
public String toString () Renvoie le nom de la classe concaténée avec le
retour de getMessage ().
public void printStackTrace () Imprime le résultat de toString () avec la pile de
trace dans System.err, le flux de sortie d'erreur
LES EXCEPTIONS
le try-with-resources

■ En règle générale, lorsque nous utilisons des ressources telles que des flux, des
connexions, etc., nous devons les fermer explicitement à l'aide du bloc finally.

■ Dans le programme suivant, nous lisons les données d’un fichier à l’aide de FileReader
et nous les fermons à l’aide du bloc finally.

■ try-with-resources, également appelé gestion automatique des ressources, est un


mécanisme de traitement des exceptions introduit dans Java 7, qui ferme
automatiquement les ressources utilisées dans le bloc try catch.
LES EXCEPTIONS
le try-with-resources
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class LireFichier {

public static void main(String args[]) {


FileReader fr = null;
try {
File fichier = new File ("C:\\fichier.txt");
fr = new FileReader ( fichier ) ; char [] caracteres = new char[50];
fr.read ( caracteres ) ; // Lit le contenu dans le tableau
for ( char c : caracteres )
System.out.print ( c ) ; // prints the characters one by one
} catch ( IOException e ) {
e.printStackTrace ();
} finally {
try {
fr.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
}
LES EXCEPTIONS
le try-with-resources
■ Pour utiliser le try-with-ressources, il suffit de déclarer les ressources requises dans la
parenthèse suivant le try et les ressources créées seront automatiquement fermées à la fin
du bloc.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class LireFichier {

public static void main(String args[]) {


FileReader fr = null;
try ( File fichier = new File ("C:\\fichier.txt") ) {
fr = new FileReader ( fichier ) ; char [] caracteres = new char[50];
fr.read ( caracteres ) ; // Lit le contenu dans le tableau
for ( char c : caracteres )
System.out.print ( c ) ; // prints the characters one by one
} catch ( IOException e ) {
e.printStackTrace ();
}
}
}
LES EXCEPTIONS
le try-with-resources
■ Quelques points d’attention à prendre en considération lorsqu’on utilise le try-with-
resources :

❖ Pour utiliser une classe avec une instruction try-with-resources, elle doit
implémenter l'interface AutoCloseable et sa méthode close () est
invoquée automatiquement au moment de l'exécution.

❖ Il est possible de déclarer plus d'une classe dans l'instruction try-with-


resources.

❖ Les classes sont fermées dans l'ordre inverse de leur déclaration dans le bloc
try de l'instruction try-with-resources.

❖ La ressource déclarée dans try est instanciée juste avant le début du bloc try.
LES EXCEPTIONS
personnalisées
Créer sa propre classe d’exception
■ Si aucune classe d’exception de la bibliothèque standard ne correspond aux exceptions
que vous voulez déclencher dans une méthode, il est possible de créer une nouvelle
classe d’exception.
■ Celle-ci doit dériver …
– Soit de la classe java.lang.Exception pour créer une classe d’exception
contrôlée ;

– Soit de la classe java.lang.RuntimeException pour créer une classe


d’exception non contrôlée ;

– Soit d’une des sous-classes de


■ java.lang.Exception ou
■ java.lang.RuntimeException.
LES EXCEPTIONS
personnalisées
Créer sa propre classe d’exception
■ Le choix entre déclencher une exception contrôlée ou non est fonction des circonstances
d’utilisation de la méthode déclenchant l’exception.

■ Il n’y a pas de règle absolue

■ Il faut tenir compte des critères suivants :

❖ Une exception contrôlée est déclenchée par une méthode dont le bon
fonctionnement dépend d’une saisie correcte de l’utilisateur, ou qui peut créer des
dysfonctionnements comme pour les entrées/sorties.

❖ Une exception non contrôlée est déclenchée par une méthode en réponse à la
programmation d’un appel dans une situation incorrecte (mauvais paramètre, état
incohérent, …)
LES EXCEPTIONS
personnalisées
Créer sa propre classe d’exception
■ Syntaxe
– Presque toutes les classes d’exceptions de la bibliothèque standard sont définies
de la façon suivante :

class ClasseException extends SuperClasseException {


public ClasseException ( ) {}

public ClasseException ( String message ) {


super ( message ) ;
}
}
Les Exceptions
personnalisées

■ Application 4 – Créer vos propres classes d’exception.

■ Créer une classe User (login, password) disposant d’une


méthode d’authentification qui déclenche une exception
lorsque le login et le password ne sont pas renseignés.

■ Créer la classe d’exception


NullAuthentificationDataException dérivant de la
classe Exception à cet effet.

23/05/2022
Les Exceptions
personnalisées

■ Application 4 (suite) – Créer vos propres classes


d’exception.

■ Créer la classe d’exception :


– BadFormatAuthentificationDataException
dérivant de la classe Exception à cet effet. Cette
exception est déclenchée lorsque :
– La taille du champ login < 3 ou celle du champ
password < 4.

23/05/2022
FIN
Next : Les interfaces graphiques et la gestion
des événements avec l’API SWING

Vous aimerez peut-être aussi