Java中的try-catch块 – catch代码中的执行语句

我有一个关于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:/ by零
    在Test1.calculate(Test1.java:6)
    在Test1.main(Test1.java:15)

输出2:

 java.lang.ArithmeticException:/ by零
    在Test1.calculate(Test1.java:6)
    在Test1.main(Test1.java:15)
嗨!
再见!

我有两个问题:

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

2.)为什么有时我会在Hi!之前输出声明e.printStackTrace(),有时候在Bye之后! ? 我已经多次运行该程序,我无法理解在什么情况下我得到一个或另一个打印。

谢谢。

我使用的是Java 6和Eclipse(Ganymed)。

Exception.printStackTrace()打印到System.err而“ Hi! ”和“ Bye! ”在System.out 。 如果您在常规控制台上运行程序,它们最终会出现在屏幕上,但订单可能已经完成。 如果您通过IDE(例如NetBeans )运行程序,则可能会对流进行颜色编码,以便您轻松区分它们。

你打印“嗨!” 和“再见!” 到System.out (即stdout),而堆栈跟踪打印到System.err (即stderr)。 它们的打印顺序取决于刷新两个缓冲区的时间。

这可能是一个时间问题。 Println写入标准输出,而printStackTrace可能会连接到标准错误。 然后,它只是首先刷新哪个缓冲区的问题。

A1 – e.printStackTrace()打印到System.err而不是System.out,因此不同的流,不同的打印顺序。

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

    Interesting Posts