try-catch block in Java - execution statements in catch code

独自空忆成欢 提交于 2019-12-07 04:29:29

问题


I have a question about the order of the execution of statements in a catch block in Java. when I run the following class Test1 (see below), I expect to have as output first Hi!, then the result of the e.printStackTrace(); statement, and then Bye!. However, I never get this order. Please, look at the outputs, which I have pasted below.

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();
    }

}

Output1:

Hi!
Bye!
java.lang.ArithmeticException: / by zero
    at Test1.calculate(Test1.java:6)
    at Test1.main(Test1.java:15)

Output2:

java.lang.ArithmeticException: / by zero
    at Test1.calculate(Test1.java:6)
    at Test1.main(Test1.java:15)
Hi!
Bye!

I have two questions:

1.) The more important question: Why I always have Hi! and Bye! printed always one after the other, even though mye.printStackTrace() in the code is between them?

2.) Why sometimes I have the output of the statement e.printStackTrace() before Hi!, and sometimes after Bye! ? I have run the program many times and I cannot understand under what circumstances I get one or the other print.

Thank you.

I am using Java 6, and Eclipse (Ganymed).


回答1:


Exception.printStackTrace() prints to System.err whereas "Hi!" and "Bye!" are on System.out. If you run your program on a regular console, they eventually end up on the screen, but the order may be out. If you are running the program through an IDE (e.g. NetBeans), the streams will probably be color-coded so you can easily distinguish them.




回答2:


You print "Hi!" and "Bye!" to System.out (i.e. stdout), while the stack trace is printed to System.err (i.e. stderr). The order in which they are printed is determined by when the two buffers are flushed.




回答3:


It could be a timing issue. Println writes to standard out, while printStackTrace might be hooked up to standard error. Then it's just a matter of which buffer gets flushed first.




回答4:


A1 - e.printStackTrace() prints to System.err and not System.out, so different streams, different print order.




回答5:


try adding System.out.flush() after every print (printStackTrace included).



来源:https://stackoverflow.com/questions/512624/try-catch-block-in-java-execution-statements-in-catch-code

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!