Langages Orientés Objet Java Exceptions Arnaud LANOIX Université Nancy 2 24 octobre 2006 Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 1 / 32
Exemple public class Example { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; tableau[3] = 4 ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; 1 mia$ javac Example.java OK 2 mia$ java Example Exception in thread "main" java.lang.arrayindexoutofboundsexception : 3 at Example.main(Example.java :7) Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 3 / 32
Exemple public class Example { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; tableau[3] = 4 ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; 1 mia$ javac Example.java OK 2 mia$ java Example Exception in thread "main" java.lang.arrayindexoutofboundsexception : 3 at Example.main(Example.java :7) Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 3 / 32
Exemple public class Example { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; tableau[3] = 4 ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; 1 mia$ javac Example.java OK 2 mia$ java Example Exception in thread "main" java.lang.arrayindexoutofboundsexception : 3 at Example.main(Example.java :7) Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 3 / 32
Exemple public class Example { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; tableau[3] = 4 ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; 1 mia$ javac Example.java OK 2 mia$ java Example Exception in thread "main" java.lang.arrayindexoutofboundsexception : 3 at Example.main(Example.java :7) Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 3 / 32
Exemple public class Example { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; tableau[3] = 4 ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; 1 mia$ javac Example.java OK 2 mia$ java Example Exception in thread "main" java.lang.arrayindexoutofboundsexception : 3 at Example.main(Example.java :7) Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 3 / 32
Exemple public class Example { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; tableau[3] = 4 ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; 1 mia$ javac Example.java OK 2 mia$ java Example Exception in thread "main" java.lang.arrayindexoutofboundsexception : 3 at Example.main(Example.java :7) Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 3 / 32
Exceptions : qu est-ce que c est? = mécanisme de traitement des erreurs signaler une erreur ou une situation inhabituelle connaître la nature de l erreur, son contexte d apparition... ne pas mettre fin au programme rectifier l erreur, poursuivre ou terminer l exécution Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 4 / 32
Exceptions : avantages structurer/séparer la gestion des erreurs du programme normal Eviter de noyer le code dans de nombreux tests Eviter de traiter les erreurs comme des valeurs de retour des méthodes Une exception pour chaque type d erreur : beaucoup plus d informations hiérarchie d exceptions erreurs traitées dans l ordre de la pile d appel Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 5 / 32
Exceptions : fonctionnement 1 situation anormale détectée : on va lever une exception c.a.d. interrompre le déroulement normal du programme (i) soit levée directe par le programmeur : throw... (ii) soit une méthode utilisée lève une exception (transfert) 2 S il y a un risque qu une exception soit levée, il faut se placer dans un bloc d essai spécifique : try {... La levée d une exception provoque la sortie du bloc d essai 3 l exception doit (peut?) être capturée pour être traitée catch {... 4 l exception peut également être transférée, au lieu d être traitée directement Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 6 / 32
Lever une exception Instruction throw throws new Exception(... ) ; Les exceptions sont des objets : une nouvelle instance de Exception est construite lors de la levée de l exception appel à l un des constructeurs de Exception Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 8 / 32
Tansférer une exception Instruction throws unemethode() throws Exception // définition de la méthode // possible levée d une exception Exception On transfère le traitement de l exception : au lieu de traiter (capturer) l exception Exception ici, on diffère le traitement à la méthode qui a appelé unemethode() Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 10 / 32
Lever / transférer une exception : exemple public class Rectangle { int largeur ; int longueur ;... private void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 12 / 32
Lever / transférer une exception : exemple public class Rectangle { int largeur ; int longueur ;... private void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 12 / 32
Lever / transférer une exception : exemple public class Rectangle { int largeur ; int longueur ;... private void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 12 / 32
Capturer une exception : example public class ExampleCatch { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; try { tableau[3] = 4 ; catch (ArrayIndexOutOfBoundsException ex) { System.out.println("dépassement d indices : " + ex) ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 14 / 32
Capturer une exception : example public class ExampleCatch { public static void main(string[] args) { int[] tableau = new int[3] ; tableau[0] = 1 ; tableau[1] = 2 ; tableau[2] = 3 ; try { tableau[3] = 4 ; catch (ArrayIndexOutOfBoundsException ex) { System.out.println("dépassement d indices : " + ex) ; for (int i = 0 ; i < tableau.length ; i++) { System.out.println(tableau[i]) ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 14 / 32
Capturer une exception : example (2) 1 mia$ javac ExampleCatch.java OK 2 mia$ java ExampleCatch dépassement d indices 1 2 3 Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 15 / 32
Capturer une exception : example (2) 1 mia$ javac ExampleCatch.java OK 2 mia$ java ExampleCatch dépassement d indices 1 2 3 Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 15 / 32
Instruction try...catch try {... // Bloc d essai E : // possible appel à une méthode ou // une instruction levant une exception... catch (TypeException ex) {... // bloc de capture C : // traitement de l exception... une exception peut être levée dans le bloc E provoque la sortie immédiate du bloc E si l exception est du type TypeException, le bloc C est executé Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 17 / 32
Plusieurs clauses catch try { // bloc d essai catch (TypeException1 ex1) { // bloc de capture 1 catch (TypeException2 ex2) { // bloc de capture 2... catch (TypeExceptionN exn) { // bloc de capture N seul le premier bloc de capture compatible avec l exception levée est executé Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 19 / 32
Clause finally try { // bloc d essai catch (TypeException ex) { // bloc de capture... finally { // bloc toujours executé instructions toujours executées, exceptions captur/ ees ou non Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 21 / 32
Capturer une exception : exemple Rectangle public class Rectangle { int largeur ; int longueur ; public Rectangle() { largeur = 0 ; longueur = 0 ; public void setlargeur(int largeur) { this.largeur = largeur ; public void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 23 / 32
Capturer une exception : exemple Rectangle public class Rectangle { int largeur ; int longueur ; public Rectangle() { largeur = 0 ; longueur = 0 ; public void setlargeur(int largeur) { this.largeur = largeur ; public void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 23 / 32
Capturer une exception : exemple Rectangle public class Rectangle { int largeur ; int longueur ; public Rectangle() { largeur = 0 ; longueur = 0 ; public void setlargeur(int largeur) { this.largeur = largeur ; public void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 23 / 32
Capturer une exception : exemple Rectangle public class Rectangle { int largeur ; int longueur ; public Rectangle() { largeur = 0 ; longueur = 0 ; public void setlargeur(int largeur) { this.largeur = largeur ; public void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 23 / 32
Capturer une exception : exemple Rectangle public class Rectangle { int largeur ; int longueur ; public Rectangle() { largeur = 0 ; longueur = 0 ; public void setlargeur(int largeur) { this.largeur = largeur ; public void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 23 / 32
Capturer une exception : exemple Rectangle public class Rectangle { int largeur ; int longueur ; public Rectangle() { largeur = 0 ; longueur = 0 ; public void setlargeur(int largeur) { this.largeur = largeur ; public void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 23 / 32
Capturer une exception : exemple Rectangle public class Rectangle { int largeur ; int longueur ; public Rectangle() { largeur = 0 ; longueur = 0 ; public void setlargeur(int largeur) { this.largeur = largeur ; public void setlongueur(int longueur) throws LongueurException { if (longueur < this.largeur) { throw new LongueurException(longueur) ; this.longueur = longueur ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 23 / 32
Capturer une exception : exemple (2) static Rectangle giverectfixed(int largeur, int longueur) { Rectangle rect = new Rectangle() ; rect.setlargeur(largeur) ; try { rect.setlongueur(longueur) ; catch (LongueurException ex) { System.out.println("Longueur mal choisie : " + ex.getlongueur()) ; rect = giverectfixed(longueur,largeur) ; return rect ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 25 / 32
Capturer une exception : exemple (2) static Rectangle giverectfixed(int largeur, int longueur) { Rectangle rect = new Rectangle() ; rect.setlargeur(largeur) ; try { rect.setlongueur(longueur) ; catch (LongueurException ex) { System.out.println("Longueur mal choisie : " + ex.getlongueur()) ; rect = giverectfixed(longueur,largeur) ; return rect ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 25 / 32
Capturer une exception : exemple (2) static Rectangle giverectfixed(int largeur, int longueur) { Rectangle rect = new Rectangle() ; rect.setlargeur(largeur) ; try { rect.setlongueur(longueur) ; catch (LongueurException ex) { System.out.println("Longueur mal choisie : " + ex.getlongueur()) ; rect = giverectfixed(longueur,largeur) ; return rect ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 25 / 32
Capturer une exception : exemple (2) static Rectangle giverectfixed(int largeur, int longueur) { Rectangle rect = new Rectangle() ; rect.setlargeur(largeur) ; try { rect.setlongueur(longueur) ; catch (LongueurException ex) { System.out.println("Longueur mal choisie : " + ex.getlongueur()) ; rect = giverectfixed(longueur,largeur) ; return rect ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 25 / 32
Capturer une exception : exemple (2) static Rectangle giverectfixed(int largeur, int longueur) { Rectangle rect = new Rectangle() ; rect.setlargeur(largeur) ; try { rect.setlongueur(longueur) ; catch (LongueurException ex) { System.out.println("Longueur mal choisie : " + ex.getlongueur()) ; rect = giverectfixed(longueur,largeur) ; return rect ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 25 / 32
Capturer une exception : exemple (3) public static void main(string[] args) Rectangle rectangle ; rectangle = giverectfixed(2,3) ; System.out.println(rectangle) ; rectangle = giverectfixed(4,3) ; System.out.println(rectangle) ; rectangle = giverectfixed(2,2) ; System.out.println(rectangle) ; mia$ java RectangleMain Rectangle 2 * 3 Longueur mal choisie : 3 Rectangle 3 * 4 Rectangle 2 * 2 Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 27 / 32
Capturer une exception : exemple (3) public static void main(string[] args) Rectangle rectangle ; rectangle = giverectfixed(2,3) ; System.out.println(rectangle) ; rectangle = giverectfixed(4,3) ; System.out.println(rectangle) ; rectangle = giverectfixed(2,2) ; System.out.println(rectangle) ; mia$ java RectangleMain Rectangle 2 * 3 Longueur mal choisie : 3 Rectangle 3 * 4 Rectangle 2 * 2 Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 27 / 32
Créer une nouvelle exception Pour créer une exception, il faut étendre la classe Exception ou une de ses sous-classes Exception : un attribut privé de type String qui décrit l erreur encapsulé par la méthode getmessage() utilise la méthode tostring() (à redéfinir ou à complèter) http://java.sun.com/j2se/1.5.0/docs/api/java/lang/exception.html Il est en plus possible d ajouter de nouveaux attributs et de nouvelles méthodes pour qualifier plus précisément l exception Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 28 / 32
Hiérarchie des exceptions Sous-classes de java.lang.throwable : Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 29 / 32
Exception contrôlée Exception contrôlées : hérite directement de Exception = exceptions qui doivent être capturée par le programme Exception non-contrôlées : Error : super-classe d une hiérarchie d erreurs graves NoSuchMethodError StackOverFlowError OutOfMemoryError IllegalAccessError... RuntimeException : super-classe d une hiérarchie d exceptions non-contrôlées ArithmeticException NullPointerException NumberFormatException IndexOutOfBoundsException Il est fortement déconseillé de sous-classer ces exceptions Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 30 / 32
Créer une exception : exemple public class LongueurException extends Exception { int longueur ; public LongueurException() { longueur = 0 ; public LongueurException(int longueur) { this.longueur = longueur ; public int getlongueur() { return longueur ; public String tostring() { return super.tostring() + "[longueur=" + longueur +"]" ; Arnaud LANOIX (Université Nancy 2) Langages Orientés Objet Java 24 octobre 2006 32 / 32