2017-09-10 1 views
0

Mon code est ci-dessous: -Exception écart de flux Handling

class Varr {  
    public static void main(String[] args) {  
     try { 
      System.out.println(10/0); 
     } 
     catch(ArithmeticException e) { 
      System.out.println("catch1"); 
      System.out.println("catch1"); 
      throw new ArithmeticException ("Exce");    
     } 
     finally { 
      System.out.println("finally"); 
     } 
    } 
} 

sortie est: -

catch1 

catch1 

finally 

Exception in thread "main" java.lang.ArithmeticException: Exce 
    at one.Varr.main(Varr.java:22) 

Selon ma connaissance, le débit doit être d'abord essayer puis prendre et enfin enfin, mais en fonction de la sortie, le flux est essayer alors quelques lignes de capture jusqu'à la déclaration d'exception de lancer et enfin et l'expression d'exception de rejet de catc h bloquer enfin.

Pourquoi est-il un écart dans le flux, je veux dire, pourquoi enfin a été exécuté avant le lancer nouvelle instruction d'exception du bloc catch

+0

Peut-être que ce poste peut être utile: https://stackoverflow.com/a/3779677/7459622 –

Répondre

0

Comme un bloc de finally, par définition, doit être exécuté, peu importe le résultat de les clauses try ou catch.

Dans votre cas, l'exécution sait qu'il existe une exception qui doit être propagée vers le haut, mais avant cela, elle exécute tout ce qui se trouve dans le bloc finally.

Lorsque le bloc finally est terminé, il propage toute exception qui aurait pu être déclenchée ou le flux continue sinon.

+0

Merci pour la réponse, juste une clarification s'il vous plaît: - En cas au moment de l'exécution si jeter nouvelle déclaration d'exception catch block est exécuté avant le bloc finally puis l'objet exception sera transféré à la JVM et les programmes se termineront anormalement sans finalement avoir de chance, n'est-ce pas? et aussi s'il y a une exception dans finally block lui-même alors l'exception sera levée de finally block sans exécuter l'instruction throw exception du catch block, non? –

+0

De quoi avez-vous besoin pour vous clarifier? – alirabiee

+0

La commande est comme ceci: try-catch (es) -finally. Après finalement, s'il y a une exception en attente, elle sera lancée, sinon elle continue. – alirabiee

0

Vous pouvez jeter un oeil à la essentials of finally

Le bloc finally est toujours exécutée lors de la sortie du bloc try. Ce garantit que le bloc finally est exécuté même si une exception inattendue se produit.

+0

si c'est le cas alors pourquoi d'abord "System.out.println (" catch1 "); System.out.println ("catch1"); "les instructions du bloc catch sont exécutées avant le bloc finally? –

+0

@bharatbhushan * Cela garantit que le bloc finally est exécuté même si une exception inattendue survient. * ... donc une fois l'exception inattendue est exécuté et l'exception est levée Point à noter est jusqu'à votre deuxième 'System.out.println (" catch1 ");' il n'y a rien comme une exception inattendue – nullpointer

+0

Merci pour la réponse, juste une clarification s'il vous plaît: - Dans cas à l'exécution si lancer une nouvelle déclaration d'exception du bloc catch est exécutée avant le bloc finally alors l'objet exception sera transféré à la JVM et les programmes se termineront anormalement sans avoir de chance, et s'il y a une exception dans le bloc finally lui-même alors l'exception sera levée du bloc finally sans exécuter l'instruction throw exception du bloc catch, à droite? –