我有一个关于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:
Hi! Bye! java.lang.ArithmeticException: / by zero at Test1.calculate(Test1.java:6) at Test1.main(Test1.java:15)
输出2:
java.lang.ArithmeticException: / by zero at Test1.calculate(Test1.java:6) at Test1.main(Test1.java:15) Hi! Bye!
我有两个问题:
1。)更重要的问题:为什么我总是嗨!再见!即使代码中的mye.printStackTrace()在它们之间,也总是一个接一个地打印出来?
2。)为什么有时我会在Hi!之前输出声明e.printStackTrace(),有时候在Bye之后! ?我已经多次运行该程序,我无法理解在什么情况下我得到一个或另一个打印。
谢谢。
我正在使用Java 6和Eclipse(Ganymed)。
答案 0 :(得分:19)
Exception.printStackTrace()
打印到 System.err
,而“Hi!
”和“Bye!
”打印在 System.out
。如果您在常规控制台上运行程序,它们最终会出现在屏幕上,但订单可能已经完成。如果您通过IDE运行程序(例如NetBeans),则流可能会采用颜色编码,以便您轻松区分它们。
答案 1 :(得分:7)
你打印“嗨!”和“再见!”到System.out
(即stdout),而堆栈跟踪打印到System.err
(即stderr)。它们的打印顺序取决于刷新两个缓冲区的时间。
答案 2 :(得分:2)
这可能是一个时间问题。 Println写入标准输出,而printStackTrace可能会连接到标准错误。然后,这只是首先刷新哪个缓冲区的问题。
答案 3 :(得分:1)
A1 - e.printStackTrace()打印到System.err而不是System.out,因此不同的流,不同的打印顺序。
答案 4 :(得分:0)
尝试在每次打印后添加System.out.flush()(包括printStackTrace)。