我正在运行一些代码并希望得到一条特定的消息发送给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首先收集所有错误输出然后处理标准输出?
答案 0 :(得分:1)
写入两个不同的流本身就容易出现乱序显示,但是,System.out.println应该自动刷新每个调用,这意味着你看到的情况不应该是可能的,或者最坏的情况应该是通过同步缓解。
不幸的是,eclipse中的一个错误实际上阻止了它正常工作并导致您看到的无序行:Synchronisation problem between System.out and System.err in the console
您可能需要考虑使用日志记录框架(如logback(如果需要,+ SLF4J)),以便在保持一致排序的同时记录不同级别的消息。