我为这个程序输出了不规则的输出?为什么?

时间:2016-02-22 07:03:09

标签: java methods try-catch-finally finally

最后的例子

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 全部完成 空

1 个答案:

答案 0 :(得分:4)

基本上,您正在写信给System.outSystem.err。它不清楚(并且特定于实现)确切地说将缓冲多少数据,或者何时刷新它们,但是你不应该期望每次都保持一致。

我希望在写入System.out.flush()之后调用System.out,并在写入System.err.flush()之后调用System.err会解决这个问题 - 但至少在Eclipse中,它并没有这样做。好像。 (即使没有刷新,每次在Windows命令提示符下运行相同的代码也会提供相同的输出。)

基本上,这似乎是Eclipse控制台实现的一个人工制品。我不担心 - 只要在你尝试诊断事情时要注意它。 (如果将所有诊断输出发送到同一个流,则不会出现问题。)