Exceptions Java Les exceptions : Définition de java.sun.com Une exception est un évènement qui arrive durant l’exécution d’un programme qui interrompt le déroulement normal des instructions. Plusieurs erreurs très différentes peuvent provoquer des exceptions, d’un problème matériel à une simple erreur de programmation. Lorsque ce genre de chose arrive, une exception est créée et envoyer au système d’exécution. Une exception contient plusieurs information dont le type d’erreurs, l’état du programme, etc. Le système est alors responsable de trouver le code qui gèrera cette exception. On appel ce processus lancer une exception. Le système cherche ensuite « quelqu’un » pour s’occuper de l’exception. L’ensemble des personnes possibles est l’ensemble de méthode dans la pile des appels (call stack), en commençant par le dessus, puis jusqu’à ce qu’un gestionnaire d’exception approprié soit trouvé. Un gestionnaire est considéré approprié s’il gère des exceptions du même type que celle lancée. Si aucun gestionnaire n’est trouvé, le programme se termine. Les exceptions en JAVA sont des objets qui sont lancées, propagées et attrapées de façon à gérer les erreurs. On peut créer des objets de type Exception, d’une classe enfant personnelle ou encore utiliser les enfants déjà existant. Nous diviserons en deux parties l’étude des exceptions. D’abords nous étudierons comment attraper des exceptions lancées par des méthodes des bibliothèques standards, ensuite, nous verrons comment lancer nos propres exceptions. Parlons d’abords un peu des exceptions et de leur but. Il y a deux objectifs définis d’utiliser les exceptions, premièrement de dépolluer le code de plusieurs lignes de validation et deuxièmement créer un code plus stable. On utilise les exceptions pour traiter les erreurs de façon uniforme tout au long d’un programme, pour gérer les cas exceptionnels ou difficiles à prévoir. La base des exceptions : M.O. Pour gérer une exception (mettons écriture en dehors des bornes d’un tableau) il faut deux choses : 1. Un bloc try 2. Un ou plusieurs blocs catch. Le bloc try doit contenir la (ou les) ligne de code que l’on croit problématique. Il ne doit pas contenir trop de lignes, sinon d’autres problèmes pourraient arriver (efficacité). Un (ou des) bloc « catch » suit immédiatement le bloc « try » et contient la gestion qui sera exécuté dans où une exception serait lancée. Voici deux exemples relativement simples de gestion des exceptions. Analysez les et n’arrêter que lorsque vous les aurez parfaitement compris. Simple, parfois, dépend du point de vue. 1 Throwable Error VirtualMachineError OutOfMemoryError StackOverflow LinkageError NoSuchMethodError Exception RunTimeException ArithmeticException NullPointerException IndexOutOfBoundsException ClassCastException ClassNotFoundException, InterruptedException La casse Throwable Cette classe descend directement de Object : c'est la classe de base pour le traitements des erreurs. Cette classe possède deux constructeurs : Méthode Rôle Throwable() Throwable(String) La chaine en paramètre permet de définir un message qui décrit l'exception et qui pourra être consultée dans un bloc catch. String getMessage( ) lecture du message void printStackTrace( ) affiche l'exception et l'état de la pile d'execution au moment de son appel void printStackTrace(PrintStream s) Idem mais envoie le résultat dans un flux 2 Ces mécanismes permettent de renforcer la sécurité du code java. Exemple : une exception levée à l'exécution non capturée public class TestException { public static void main(java.lang.String[] args) { int i = 3; int j = 0; System.out.println("résultat = " + (i / j)); } } Résultat : C:>java TestException Exception in thread "main" java.lang.ArithmeticException: / by zero at tests.TestException.main(TestException.java:23) Si dans un bloc de code on fait appel à une méthode qui peut potentiellement générer une exception, on doit soit essayer de la récupérer avec try/catch, soit ajouter le mot clé throws dans la déclaration du bloc. Si on ne le fait pas, il y a une erreur à la compilation. Les erreurs et exceptions du paquetage java.lang échappe à cette contrainte. Throws permet de déléguer la responsabilité des erreurs vers la méthode appelante Ce procédé présente un inconvénient : de nombreuses méthodes des packages java indiquent dans leur déclaration qu'elles peuvent lever une exception. Cependant ceci garantie que certaines exceptions critiques seront prises explicitement en compte par le programmeur. Les mots clés try, catch et finally Le bloc try rassemble les appels de méthodes susceptibles de produire des erreurs ou des exceptions. L'instruction try est suivie d'instructions entre des accolades. Exemple : try { operation_risquée1; opération_risquée2; } catch (ExceptionInteressante e) { traitements } catch (ExceptionParticulière e) { traitements } catch (Exception e) { traitements } finally { traitement_pour_terminer_proprement; } 3 Si un événement indésirable survient dans le bloc try, la partie éventuellement non exécutée de ce bloc est abandonnée et le premier bloc catch est traité. Si catch est défini pour capturer l'exception issue du bloc try alors elle est traitée en exécutant le code associé au bloc. Si le bloc catch est vide (aucunes instructions entre les accolades) alors l'exception capturée est ignorée. Si il y a plusieurs type d'erreurs et d'exceptions à intercepter, il faut définir autant de bloc catch que de type d'événement . Par type d'exception, il faut comprendre « qui est du type de la classe de l'exception ou d'une de ces sous classes ». Ainsi dans l'ordre séquentiel des clauses catch, un type d'exception de ne doit pas venir après un type d'une exception d'une super classe. Il faut faire attention à l'ordre des clauses catch pour traiter en premier les exceptions les plus précises (sous classes) avant les exceptions plus générales. Un message d'erreur est émis par le compilateur dans le cas contraire. Exemple : erreur à la compil car Exception est traité en premier alors que ArithmeticException est une sous classe de Exception public class TestException { public static void main(java.lang.String[] args) { // Insert code to start the application here. int i = 3; int j = 0; try { System.out.println("résultat = " + (i / j)); } catch (Exception e) { } catch (ArithmeticException e) { } } } Résultat : C:\tests>javac TestException.java TestException.java:11: catch not reached. catch (ArithmeticException e) { ^ 1 error Si l'exception générée est une instance de la classe déclarée dans la clause catch ou d'une classe dérivée, alors on exécute le bloc associé. Si l'exception n'est pas traitées par un bloc catch, elle sera transmise au bloc de niveau supérieur. Si l'on ne se trouve pas dans un autre bloc try, on quitte la méthode en cours, qui regénère à son tour une exception dans la méthode appelante. L'exécution totale du bloc try et d'un bloc d'une clause catch sont mutuellement exclusives : si une exception est levée, l'exécution du bloc try est arrêtée et si elle existe, la clause catch adéquate est exécutée. La clause finally définit un bloc qui sera toujours exécuté, qu'une exception soit levée ou non. Ce bloc est facultatif. Il est aussi exécuté si dans le bloc try il y a une instruction break ou continue. Exemple : 4 public class TestException { public static void main(java.lang.String[] args) { // Insert code to start the application here. int i = 3; int j = 0; try { System.out.println("résultat = " + (i / j)); } catch (ArithmeticException e) { System.out.println("getmessage"); System.out.println(e.getMessage()); System.out.println(" "); System.out.println("toString"); System.out.println(e.toString()); System.out.println(" "); System.out.println("printStackTrace"); e.printStackTrace(); } } } Résultat : C:>java TestException getmessage / by zero toString java.lang.ArithmeticException: / by zero printStackTrace java.lang.ArithmeticException: / by zero at tests.TestException.main(TestException.java:24) Les classes Exception, RunTimeException et Error Ces trois classes descendent de Throwable : en fait, toutes les exceptions dérivent de la classe Throwable. La classe Error représente une erreur grave intervenue dans la machine virtuelle Java ou dans un sous système Java. L'application Java s'arrête instantanement dès l'apparition d'une exception de la classe Error. La classe Exception représente des erreurs moins graves. La classe RuntimeException n'ont pas besoin d'être détectées impérativement par des blocs try/catch 5