Java non apprise exceptions <br /> Avant d'apprendre à gérer les exceptions dans un programme, il est avantageux de voir ce qui se passe si vous ne les gérez pas. L'applet suivant comprend une expression qui provoque délibérément une erreur divisée zéro.
classe exc0 {public static void main (String args []) {int d = 0;
Lorsque le système d'exécution Java vérifie la situation divisée par zéro, il construit un nouvel objet d'exception et lance l'exception. Cela provoque l'arrêt de l'exécution de l'exc0, car une fois une exception lancée, il doit être capturé par un gestionnaire d'exceptions et traité immédiatement. Dans cet exemple, nous ne fournissons aucun de nos propres gestionnaires d'exception, donc l'exception est capturée par le gestionnaire par défaut du système d'exécution Java. Toute exception qui n'est pas capturée par votre programme sera finalement gérée par le gestionnaire par défaut. Le gestionnaire par défaut affiche une chaîne décrivant l'exception, imprime la trace de pile où l'exception se produit et termine le programme.
Voici la sortie générée par l'interprète d'exécution JavaJDK standard pour exécuter le programme:
java.lang.arithmeticexception: / par zéro à exc0.main (exc0.java:4)
Remarque comment le nom de classe Exc0, le nom de la méthode Main, le nom de fichier exc0.java et le numéro 4 de la ligne sont inclus dans une piste d'utilisation de pile simple. Notez également que le type d'exception lancé est une sous-classe d'exception appelée arithmeticexception, qui décrit plus clairement quel type de méthode d'erreur. Discutez plus loin dans ce chapitre, Java fournit plusieurs types d'exceptions intégrés qui correspondent à différents types d'erreurs d'exécution qui peuvent être générés.
La piste de pile affichera la séquence des appels de méthode qui ont abouti à l'erreur. Par exemple, voici une autre version du programme précédent qui introduit la même erreur, mais l'erreur est générée dans une autre méthode autre que la méthode principale ():
Classe exc1 {static void subRoutine () {int d = 0; int a = 10 / d;} public static void main (String args []) {exc1.SubRoutine ();
Les résultats de la piste de pile du gestionnaire d'exceptions par défaut montrent comment toute la pile d'appels est affichée:
java.lang.arithmeticexception: / par zéro à exc1.subroutine (exc1.java:4) à exc1.main (exc1.java:7)
Comme vous pouvez le voir, le bas de la pile est la ligne 7 de Main, qui appelle la méthode Sub-Routine (). Cette méthode provoque une exception à la ligne 4. La pile d'appels est importante pour le débogage car elle identifie les étapes exactes qui mènent à l'erreur.
Déclats de la nidification de Java Try
Essayez les déclarations peuvent être imbriquées. Autrement dit, une déclaration d'essai peut être à l'intérieur d'un autre bloc d'essai. Chaque fois que vous entrez dans une déclaration d'essai, l'exception est avant et après les relations sera poussée sur la pile. Si une instruction TRYS interne ne contient pas de gestionnaire de captures à des exceptions spéciales, la pile apparaîtra et le gestionnaire de capture de l'instruction TRYAT NEXT Vérifiera s'il le correspond. Ce processus se poursuivra jusqu'à ce qu'une déclaration de capture correspond avec succès, ou jusqu'à ce que toutes les instructions d'essai imbriquées soient épuisées. Si aucune déclaration de capture ne correspond, le système d'exécution Java gérera cette exception. Voici un exemple d'utilisation des instructions d'essai imbriquées:
// Un exemple d'instructions d'essai imbriquées.classe nestry {public static void main (String args []) {try {int a = args.length; Diviser -By-Zero Exception. Diviser -By-Zero Exception sera générée par le code suivant. OU T -of-Bounds Exception. E) {System.out.println ("Array Index Out-of-Bounds:" + E);}} Catch (ArithmeTicexception e) {System.out.println ("Diviser par 0:" + e);
Comme vous pouvez le voir, le programme niche un autre bloc d'essai dans un bloc d'essai. Le programme fonctionne comme suit: Lorsque vous exécutez le programme sans paramètres de ligne de commande, le bloc d'essai extérieur générera une exception divisée par zéro. Le programme est exécuté dans une condition de paramètre de ligne de commande, et une erreur divisée par un bloc d'essai imbriqué entraîne une erreur divisible. Étant donné que le bloc intérieur ne correspond pas à cette exception, elle passera l'exception au bloc d'essai extérieur où l'exception est traitée. Si vous exécutez le programme avec deux paramètres de ligne de commande, une exception de limite de tableau est générée par le bloc d'essai interne. Les résultats suivants illustrent chaque cas:
C: /> java nestrydivide by 0: java.lang.arithmeticexception: / by zeroc: /> java nestry onea = 1divide by 0: java.lang.arithmeticexception: / by zeroc: /> java Nesttry un deux = 2Array Index Out- out- des limites: java.lang.arrayindexoutofboundSexception
Lorsqu'il y a un appel de méthode, les déclarations de nidification des émissions peuvent se produire très secrètement. Par exemple, vous pouvez passer un appel à une méthode dans un bloc d'essai. À l'intérieur de cette méthode, il y a une autre déclaration d'essai. Dans ce cas, l'essai à l'intérieur de la méthode est toujours imbriqué dans le bloc d'essai qui appelle la méthode à l'extérieur. Ce qui suit est une modification de l'exemple précédent, et les blocs d'essai imbriqués sont déplacés à l'intérieur de la méthode nestry ():
/ * Les instructions d'essai peuvent être implicitement imbriquées via les appels aux méthodes. - Une exception zéro sera générée par le code suivant. F- Bounds Exception. .out .println ("Index du tableau Out-of-Bounds:" + e);}} public static void main (String args []) {try {int a = args.length; Prevoyée, l'instruction suivante générera une exception divisée par zéro. ) {Système.
La sortie de ce programme est la même que dans l'exemple précédent.