2009-02-04 5 views
5

J'ai une question sur l'ordre d'exécution des instructions dans un bloc catch en Java. lorsque je lance la classe Test1 suivante (voir ci-dessous), je m'attends à avoir en sortie Hi !, puis le résultat de l'e.printStackTrace(); déclaration, puis Bye !. Cependant, je ne reçois jamais cet ordre. S'il vous plaît, regardez les sorties, que j'ai collées ci-dessous.bloc try-catch en Java - instructions d'exécution dans le code catch

public class Test1 { 

    public static void calculate() { 
     try { 
      int h = 5/0; 
     } catch (ArithmeticException e) { 
      System.out.println("Hi!"); 
      e.printStackTrace(); 
     } 
     System.out.println("Bye!"); 
    } 

    public static void main(String[] args) { 
     calculate(); 
    } 

} 

Sortie1:

 
Hi! 
Bye! 
java.lang.ArithmeticException:/by zero 
    at Test1.calculate(Test1.java:6) 
    at Test1.main(Test1.java:15) 

Output2:

 
java.lang.ArithmeticException:/by zero 
    at Test1.calculate(Test1.java:6) 
    at Test1.main(Test1.java:15) 
Hi! 
Bye! 

J'ai deux questions:

1.) La question la plus importante: pourquoi j'ai toujours Salut! et Bye! imprimé toujours l'un après l'autre, même si mye.printStackTrace() dans le code est entre eux?

2.) Pourquoi parfois j'ai la sortie de l'instruction e.printStackTrace() avant Hi !, et parfois après Bye! ? J'ai exécuté le programme plusieurs fois et je ne peux pas comprendre dans quelles circonstances j'obtiens l'un ou l'autre impression.

Merci. J'utilise Java 6 et Eclipse (Ganymed). J'utilise Java 6 et Eclipse (Ganymed).

Répondre

18

Exception.printStackTrace() imprime à System.err alors que "Hi!" et "Bye!" sont sur System.out. Si vous exécutez votre programme sur une console normale, ils finissent par apparaître à l'écran, mais l'ordre peut être épuisé. Si vous exécutez le programme via un IDE (par exemple NetBeans), les flux seront probablement codés en couleur afin que vous puissiez les distinguer facilement.

2

Cela pourrait être un problème de synchronisation. Println écrit en standard, tandis que printStackTrace peut être connecté à une erreur standard. Ensuite, c'est juste une question de tampon qui est rincé en premier.

7

Vous imprimez "Hi!" et "Bye!" à System.out (c'est-à-dire stdout), tandis que la trace de pile est imprimée à System.err (c'est-à-dire stderr). L'ordre dans lequel ils sont imprimés est déterminé par le moment où les deux tampons sont vidés.

+1

Notez que vous pouvez spécifier le flux pour Throwable # printStackTrace(), par ex. e.printStackTrace (System.out) –

0

Essayez d'ajouter System.out.flush() après chaque impression (printStackTrace inclus).

+0

Cela ne corrige pas la prédiction de l'ordre de sortie. – mark

1

A1 - e.printStackTrace() imprime sur System.err et non sur System.out, donc des flux différents, des ordres d'impression différents.

Questions connexes