Причина, по которой вы видите, что трассировка стека печатается между операторами System.out.println()
, заключается в том, что System.out
буферизуется, а System.err
(используется трассировкой стека) - не буферизируется.
Если вы хотите, чтобы текст отображался в точном порядке, в котором происходят события, вам необходимо «снять буфер» с System.out
. Самый простой способ - просто использовать System.err
вместо System.out
.
В противном случае, вызовите System.out.flush()
до того, как ваши следы в стеке произойдут в предложениях catch
.
Вариант 2. Используйте класс Logger
.
Вариант 3: Реализация собственного «буфера». Другими словами, сначала запишите все в свой собственный буфер, включая трассировку стека (используя .toString()
или как хотите), а затем в catch
очистите свой собственный буфер. (Это несколько избыточно, так как вы можете просто сбросить System.out
).
- == -
ОТ КОММЕНТАРИИ
Конечно. Класс Logger
можно использовать для создания более надежного и подробного процесса регистрации. Обычно это то, что делается в приложениях. Экземпляр класса Logger
извлекается из класса Logger
(он является одиночным), принимая в качестве параметра класс, из которого будет использоваться. Затем вы записываете в него сообщения, используя метод .log()
. Приятной особенностью класса Logger
является то, что вы можете устанавливать для него уровни (например, DEBUG
, WARN
...), и тогда вы сможете фильтровать / отображать только то, что вам нужно. Сообщения «log» затем отображаются в консоли единообразно, обычно в формате:
2010-11-23 14:45:32,032 DEBUG [MyClass] Your message
Вышеуказанный формат взят из log4j
, но вы можете использовать стандартную Java Logger
. Вывод должен быть похожим, может быть немного меньше. Но я уверен, что это можно настроить.