2013-06-21 74 views
0

进出口运行一些代码,并期望得到送到Systen.err在一个点出来一个特定的消息,但由于某种原因它的现身在另一点。下面是代码 -Eclipse的标准输出/错误同步

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(); 
    } 

,这里是输出 -

***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{}} 

现在基于代码输出的第一行应该是倒数第二行。但是,当我在eclipse中运行它时,它会作为第一行出现。为什么是这样?我还注意到,如果我将System.err更改为System.out,则按预期发布。所以看起来Eclipse首先收集所有的错误输出,然后处理标准输出?

+0

'err'优先,并立即被打印出来。我曾经有过在一行中间打印堆栈轨迹的情况。 – 2013-06-21 17:22:30

回答

1

写入到两个不同的流本质上是容易出现乱序显示,但是,应该的System.out.println自动冲水每次调用的,也就是说,你所看到的情况应该是不可能的,或者在最坏的情况应该是能够通过同步来缓解。

不幸的是,在Eclipse中的错误实际上阻止,这是正常工作,并导致出的顺序,你看到线路:Synchronisation problem between System.out and System.err in the console

你可能要考虑使用一个日志框架如的logback(+ SLF4J如果期望的)来允许您在保持一致的排序的同时记录不同级别的消息。

相关问题