5

我对 Java 中的 catch 块中语句的执行顺序有疑问。当我运行以下类 Test1(见下文)时,我希望首先输出 Hi!,然后是 e.printStackTrace(); 声明,然后再见!但是,我从来没有收到过这个订单。请查看我在下面粘贴的输出。

public class Test1 {

    public static void calculate() {
        try {
             int h = 5/0; 
        } catch (ArithmeticException e) {
            System.out.println("Hi!");
            e.printStackTrace();
        } 
        System.out.println("Bye!");
    }

    public static void main(String[] args) {
        calculate();
    }

}

输出1:

你好!
再见!
java.lang.ArithmeticException: / 由零
    在 Test1.calculate(Test1.java:6)
    在 Test1.main(Test1.java:15)

输出2:

java.lang.ArithmeticException: / 由零
    在 Test1.calculate(Test1.java:6)
    在 Test1.main(Test1.java:15)
你好!
再见!

我有两个问题:

1.)更重要的问题:为什么我总是有嗨!再见!总是一个接一个地打印,即使代码中的 mye.printStackTrace() 在它们之间?

2.) 为什么有时我在 Hi! 之前有语句 e.printStackTrace() 的输出,有时在再见!? 我已经多次运行该程序,但我无法理解在什么情况下我会得到一份或另一份打印。

谢谢你。

我正在使用 Java 6 和 Eclipse (Ganymed)。

4

5 回答 5

19

Exception.printStackTrace()打印到System.err而 " Hi!" 和 " Bye!" 处于打开状态System.out。如果您在常规控制台上运行程序,它们最终会出现在屏幕上,但顺序可能会失效。如果您通过 IDE(例如NetBeans)运行程序,则流可能会进行颜色编码,以便您可以轻松区分它们。

于 2009-02-04T18:24:27.993 回答
7

你打印“嗨!” 和“再见!” 到System.out(即标准输出),而堆栈跟踪打印到System.err(即标准错误)。它们的打印顺序由刷新两个缓冲区的时间决定。

于 2009-02-04T18:25:43.187 回答
2

这可能是时间问题。Println 写入标准输出,而 printStackTrace 可能与标准错误挂钩。那么这只是首先刷新哪个缓冲区的问题。

于 2009-02-04T18:25:11.517 回答
1

A1 - e.printStackTrace() 打印到 System.err 而不是 System.out,所以不同的流,不同的打印顺序。

于 2009-02-04T18:26:24.870 回答
0

尝试在每次打印后添加 System.out.flush()(包括 printStackTrace)。

于 2009-02-04T18:25:50.690 回答