Eclipse标准输出/错误同步

时间:2013-06-21 17:20:28

标签: java eclipse

我正在运行一些代码并希望得到一条特定的消息发送给Systen.err,以便在某一时刻出现,但出于某种原因,它会在另一个点出现。这是代码 -

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首先收集所有错误输出然后处理标准输出?

1 个答案:

答案 0 :(得分:1)

写入两个不同的流本身就容易出现乱序显示,但是,System.out.println应该自动刷新每个调用,这意味着你看到的情况不应该是可能的,或者最坏的情况应该是通过同步缓解。

不幸的是,eclipse中的一个错误实际上阻止了它正常工作并导致您看到的无序行:Synchronisation problem between System.out and System.err in the console

您可能需要考虑使用日志记录框架(如logback(如果需要,+ SLF4J)),以便在保持一致排序的同时记录不同级别的消息。