Eclipse中的控制台打印顺序

7
我有一个在Eclipse中编写的简单算术程序。每次我在Eclipse中运行程序时,输出结果都以奇怪的顺序出现。有时异常会在最后一个打印语句之前出现(这是正确的方式),有时则相反,以混乱的顺序出现。为什么会发生这种情况,如何纠正它?是否有任何设置可以使其每次执行时以正确的方式打印。下面的屏幕截图显示了它的外观。请帮助我解决这个问题。
正确顺序: Correct Order when run 在运行几次后的错误顺序: Incorrect Order
 package com;

    public class Abc {

        /**
         * @param args
         */
        public static void main(String[] args) {

            System.out.println("begin main");
            // TODO Auto-generated method stub
            int a = 10;
            int b = 0;
            int c = 0;


            System.out.println("value of a BD is " + a);
            System.out.println("value of b BD is " + b);
            System.out.println("value of c BD is " + c);

            c = a/b; //Arthmetic Exception

            System.out.println("value of a AD is " + a);
            System.out.println("value of b AD is " + b);
            System.out.println("value of c AD is " + c);



        }

    }

当监管人员放置此类评论时,如果他们贴出重复链接将会很有帮助。 - Brian Reinhold
2个回答

12

这里使用了两个不同的流。您正在使用System.out. 并且异常信息是通过System.err打印的。它们都进行缓冲,因此一个输出可能会在另一个输出之前先打印。

在异常行之前,您可以调用System.out.flush();

System.out.flush();
c = a/b;  //Arthmetic Exception

3
另一种方法是将错误流设置为输出流,例如 System.setErr(System.out); 这样只需要使用一个流来控制控制台输出。 - Pshemo
不幸的是,这并不能可靠地解决问题... - Markus A.

6
稍微详细一些:来自您的打印语句的输出将进入System.out。然而,异常消息将进入System.err(请参见此处)。这两个是独立的输出流,它们恰好都会到达同一个位置:您的控制台。它们被缓冲并独立地处理。在第二种情况下,您显示的print语句正在缓冲但尚未打印时发生异常。 编辑这里有一个额外的复杂性,即Eclipse控制台不是真正的Windows控制台。如其他地方所述(例如此处),过去在Windows平台上Eclipse控制台存在问题,因为Windows没有提供给Eclipse一个使其控制台像本机控制台一样表现良好的好方法。如果添加了flush调用仍然存在问题,请尝试从命令提示符中运行程序,看看是否有所不同。

旁注,与答案无关:如果你想在表格中添加链接 [描述](链接) ,则不要忘记链接中的协议,如 http:// 。或者更好的方式是使用 Ctrl+L 选项。这将在链接中添加 http:// 部分,并使你的答案在后期编辑时更容易处理。 - Pshemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接