блок try-catch в Java - операторы выполнения в коде catch - PullRequest
5 голосов
/ 04 февраля 2009

У меня есть вопрос о порядке выполнения операторов в блоке catch в Java. когда я запускаю следующий класс 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();
    }

}

Output1:

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.) Почему иногда у меня вывод команды e.printStackTrace () до Hi !, а иногда после Bye! ? Я запускал программу много раз, и я не могу понять, при каких обстоятельствах я получаю тот или иной отпечаток.

Спасибо.

Я использую Java 6 и Eclipse (Ganymed).

Ответы [ 5 ]

19 голосов
/ 04 февраля 2009

Exception.printStackTrace() печатает до System.err, тогда как "Hi!" и "Bye!" включены System.out. Если вы запустите свою программу на обычной консоли, они в конечном итоге окажутся на экране, но порядок может быть и нет. Если вы запускаете программу через IDE (например, NetBeans ), потоки, вероятно, будут иметь цветовую кодировку, чтобы вы могли легко их различить.

7 голосов
/ 04 февраля 2009

Вы печатаете "Привет!" и "Пока!" на System.out (т.е. стандартный вывод), в то время как трассировка стека выводится на System.err (то есть на стандартный вывод). Порядок, в котором они печатаются, определяется моментом сброса двух буферов.

2 голосов
/ 04 февраля 2009

Это может быть проблема времени. Println записывает в стандартный формат, в то время как printStackTrace может быть подключен к стандартной ошибке. Тогда вопрос только в том, какой буфер будет очищен первым.

1 голос
/ 04 февраля 2009

A1 - e.printStackTrace () печатает в System.err, а не в System.out, поэтому разные потоки, другой порядок печати. ​​

0 голосов
/ 04 февраля 2009

попробуйте добавить System.out.flush () после каждой печати (включая printStackTrace).

...