2013-06-21 5 views
0

Je cours un peu de code et je m'attends à recevoir un message spécifique envoyé à Systen.err pour sortir à un moment donné, mais pour une raison quelconque, il sortira à un autre moment. Voici le code -Sortie standard Eclipse/synchronisation des erreurs

public static void main(String[] args) throws Exception {  
     System.out.println("File 1:");  
     for (NormalizedEntity ne : theSolution.entities.values()){ 
      System.out.println(ne); 
     } 

     System.out.println("\nFile 2:"); 
     for (NormalizedEntity ne : theSubmission.entities.values()){ 
      System.out.println(ne); 
     } 
     System.out.println(check()); 
    } 

    static String check() { 
     StringBuilder resultString = new StringBuilder(); 

     System.out.println("\nstarting check"); 
     for (NormalizedEntity solutionEntity : theSolution.entities.values()){ 
      NormalizedEntity submissionEntity = theSubmission.entities.get(solutionEntity.name); 

      if(solutionEntity instanceof NormalizedClass){ 
       if(!(submissionEntity instanceof NormalizedClass)){ 
        System.err.println("***WARNING: solutionEntity " + solutionEntity + "is a class but submissionEntity " + submissionEntity + " is not");//<---This line should be second to last 
        resultString.append("Expected " + submissionEntity + " to be a class called " + solutionEntity); 
       }    
      } 

      //System.out.println("Found: " + ne + " in both"); 
     } 
     return resultString.toString(); 
    } 

Et voici la sortie -

***WARNING: solutionEntity Class C {x=private int x, y=private int y} {C=C{1thParam=int, 2thParam=int}} {getX=int getX{}}is a class but submissionEntity null is not <--------- THIS LINE SHOULD BE AT THE END 
File 1: 
Class C {x=private int x, y=private int y} {C=C{1thParam=int, 2thParam=int}} {getX=int getX{}} 
Class SubC {z=private int z} {} {} 
C c 
double d 
int f{} 
int i 
SubC subC 

File 2: 
Class D {x=private int x, y=private int y} {D=D{1thParam=int, 2thParam=int}} {getX=int getX{}} 
Class SubC {z=private int z} {} {} 
D c 
double d 
int f{} 
int i 
SubC subC 

starting check 
Expected null to be a class called Class C {x=private int x, y=private int y} {C=C{1thParam=int, 2thParam=int}} {getX=int getX{}} 

maintenant basé sur le code de la première ligne de sortie devrait être la deuxième à la dernière ligne. Cependant, quand je cours cela en éclipse, il apparaît comme la première ligne. Pourquoi est-ce? J'ai également remarqué que si je change le System.err en System.out il sort comme prévu. Donc, il semble que Eclipse recueille d'abord toutes les sorties d'erreur et traite ensuite la sortie standard?

+0

'err' a priorité et est immédiatement imprimé. J'ai eu des cas où une trace de pile a été imprimée au milieu d'une ligne. –

Répondre

1

L'écriture dans deux flux différents est intrinsèquement sujette à un affichage hors service, cependant, System.out.println devrait être automatiquement vidé avec chaque appel, ce qui signifie que la situation que vous voyez ne devrait pas être possible ou, au pire, devrait être capable d'être atténué avec la synchronisation.

Malheureusement, un bug dans l'éclipse empêche effectivement ce de fonctionner correctement et conduisant à la hors lignes pour vous voir: Synchronisation problem between System.out and System.err in the console

Vous voudrez peut-être envisager d'utiliser un cadre de l'exploitation forestière tels que logback (+ SLF4J si désiré) pour vous permettre d'enregistrer différents niveaux de messages tout en maintenant un ordre cohérent.

Questions connexes