最后的例子
public class FinallyExample {
public static void main(String[] args) {
new FinallyExample().dothework();
}
public void dothework()
{
Object o=null;
for(int i=0;i<=4;i++)
{
System.out.println(" "+i);
try{ o=makeObj(i);}catch(IllegalArgumentException e){System.err.println("Error: ("+e.getMessage()+").");}
finally{System.err.println("All done");
/*if(o==null)
{
System.exit(0);
}*/
}
System.out.println(o);
}
}
public Object makeObj(int type) throws IllegalArgumentException
{
if(type==1) throw new IllegalArgumentException ("Don't like type"+type);
return null;
}
}
输出顺序总是不同的!
我正在使用eclipse。
O / P- 全部完成 错误:(不要喜欢type1)。 0 //当i = 1时,该行应该打印 空值 1
全部完成 空值 2 全部完成 空值 3 全部完成 空值 4 全部完成 空
O / P-0 所有donenull 1
错误:(不喜欢type1)。 全部完成 空值 2 全部完成 空值 3 全部完成 空值 4 全部完成 空
答案 0 :(得分:4)
基本上,您正在写信给System.out
和System.err
。它不清楚(并且特定于实现)确切地说将缓冲多少数据,或者何时刷新它们,但是你不应该期望每次都保持一致。
我希望在写入System.out.flush()
之后调用System.out
,并在写入System.err.flush()
之后调用System.err
会解决这个问题 - 但至少在Eclipse中,它并没有这样做。好像。 (即使没有刷新,每次在Windows命令提示符下运行相同的代码也会提供相同的输出。)
基本上,这似乎是Eclipse控制台实现的一个人工制品。我不担心 - 只要在你尝试诊断事情时要注意它。 (如果将所有诊断输出发送到同一个流,则不会出现问题。)