Les exceptions en Java¶
Une exception est un problème survenant lors de l’exécution d’un programme.
Il est possible de les gérer afin qu’un programme puisse continuer son exécution normale même avec la présence d’erreur.
Une exception est une erreur qui arrive dans la phase d’exécution d’un programme. Généralement, c’est une instruction qui est impossible à faire pour Java.
Un exemple simple, est le fait d’utiliser un index plus grand que l’allocation mémoire d’un tableau, ce qui déclenchera une exception de type ArrayOutOfBoundsException.
Une exception est un objet qui représente une erreur ou une condition d’erreur.
Si une exception n’est pas gérée de manière adéquate, le programme se terminera de manière non-prévu (unexpected termination).
Les exceptions sont situées dans le paquetage java.lang.
Dans cette section, nous verrons les différents types d’exception ainsi que la manière de les gérer afin de vous donner les connaissances pour développer une application robuste !
Prenons pour exemple le petit bout de programme suivant :
public class ExceptionExample {
public static void main(String[] args) {
int nombre1 = 7;
int nombre2 = 0;
int total = nombre1 / nombre2;
}
}
Comment ce programme réagira-t-il ?
Exception in thread "main" java.lang.ArithmeticException: / by zero at org.calma.semaine10.ExceptionExample.main(ExceptionExample.java:8)
On peut clairement y apercevoir un problème (une exception) !
Une méthode dans un programme ne devrait pas décider de terminer l’exécution d’un programme.
C’est à l’utilisateur de prendre cette décision...
Pour gérer les exceptions, Java et à notre disposition plusieurs mots clé; try, catch, finally et throw(s).
Le mot clé try est utilisé pour marquer un bout de code où il risque de s’y produire des exceptions.
Le mot clé catch est utilisé pour définir un bout de code qui sera exécuter si une exception se produit.
Il est impossible d’utiliser un try sans un catch, les deux (2) fonctionnent en paire.
Cependant, il est possible d’avoir plusieurs blocs de type catch qui attraperont de manière hiérarchique les exceptions.
C’est-à-dire de la plus spécifique à la plus générique.
public class Quotient {
private int number1;
private int number2;
public Quotient(int number1, int number2) {
this.number1 = number1;
this.number2 = number2;
}
public int execute(){
int total = 0;
try{
total = number1 / number2;
}
catch(ArithmeticException e){
System.out.println("Voici une exception... " + e.toString());
}
catch(Exception e){
System.out.println("Voici une autre exception, plus générale... " + e.toString());
}
return total;
}
}
Le mot clé finally est optionnel.
Il nous permet de définir un bout de code qui sera exécuter même si une exception est générée ou lancer à l’intérieur de la section try.
Même si une instruction de retour (return) est spécifiée dans votre bloc try ou catch, le bloc de code finally sera exécuter tout de même.
Il n’est pas nécessaire de définir un bloc catch ou finally, il est possible d’avoir seulement un catch, ou les deux (2).
Quant au mot clé throw(s), il nous permet de lancer une exception qui sera traitée dans une autre section (une autre section catch) du code (i.e. : pas dans la méthode courante).
De plus, throw(s) est bien utile pour lancer des exceptions personnalisées, c'est-à-dire qu’il est possible de définir vos propres types d’exception.
Il est à noter que si une méthode lance une exception, l’exception doit apparaitre dans la signature de la méthode.
Exception personnalisée¶
En utilisant la classe Exception de Java, il est possible de définir des types d’exception spécialisée et personnalisée.
Il faut étendre la classe Exception comme ceci :
public class UnderAgeException extends Exception {
public UnderAgeException(String errorMessage) {
super(errorMessage);
}
}
Et de l’utilisé de cette manière :
public class AgeChecker {
private int age;
public AgeChecker(int age) {
this.age = age;
}
public boolean check() throws UnderAgeException {
if(this.age < 18){
throw new UnderAgeException("Erreur! - Cette personne à moins de 18 ans");
}
return false;
}
}
AgeChecker ageChecker = new AgeChecker(20);
try{
ageChecker.check();
}
catch (UnderAgeException e) {
System.out.println("Acces refuse!");
System.out.println("Votre tentative d'acces est enregistrer dans nos systemes...");
return;
}
System.out.println("Poursuite des operations");