2015-12-02 1 views
0

On m'a récemment demandé dans une interview sur la séquence d'exécution d'un cas d'exception dans java, où si l'exception n'est pas interceptée et propagée vers le code appelant, bloque enfin, alors les instructions block définitives sont-elles imprimées? Si oui, sont-ils imprimés avant ou après?Pourquoi y a-t-il une incohérence dans l'exécution du bloc avec exception non interceptée?

J'ai essayé d'exécuter ce scénario et trouvé une incohérence dans les sorties.

Le code que j'ai essayé est:

FinallyExecution public class {

public static void main(String[] args) { 

    try{ 

     FinallyExecution.divide(100, 0); 

    }finally{ 
     System.out.println("finally in main"); 
    } 

} 

public static void divide(int n, int div){ 

    try{ 
     int ans = n/div; 
    } 
    finally{ 
     System.out.println("finally of divide"); 
    } 
} 

}

Et les sorties incohérentes sont:

fois:

Exception in thread "main" java.lang.ArithmeticException:/by zero at exceptions.FinallyExecution.divide(FinallyExecution.java:20) at exceptions.FinallyExecution.main(FinallyExecution.java:9) finally of divide finally in main

et suivant:

finally of divide finally in main Exception in thread "main" java.lang.ArithmeticException:/by zero at exceptions.FinallyExecution.divide(FinallyExecution.java:20) at exceptions.FinallyExecution.main(FinallyExecution.java:9)

Alors qu'est-ce qui se passe exactement dans ce cas ?? La JVM exécute-t-elle les blocs finally, puis sort avec exception, ou est-elle dans l'ordre inverse? Dans les deux cas, pourquoi la sortie est-elle incohérente?

+1

Peut-être un meilleur duplicata: http://stackoverflow.com/questions/33189792/try-catch-finally-order-of-execution-appears-to-be-random –

Répondre

1

Vous imprimez en System.out tandis que la piletrace d'exception non interceptée est imprimée à System.err. Vous voyez les deux contenus dans la console, mais il n'est pas défini dans quel ordre.

Si vous modifiez vos impressions de débogage pour utiliser System.err, la commande est cohérente.

+0

Ceci explique l'incohérence. Je vous remercie – Prajakta