Подтвердить что ты не робот

Разница между e.printStackTrace и System.out.println(e)

Вероятно, вопрос новичков, но все, кажется, используют e.printStackTrace(), но я всегда использовал System.out.println(e) при обработке исключений. В чем разница и почему e.printStackTrace() предпочтительнее?

4b9b3361

Ответ 1

Используемый выходной поток не совпадает с указанным @Brian, но уровень детализации не тот же - вы можете попробовать с простым тестом ниже. Выход:

С println: вы знаете только, какое исключение было выбрано

java.lang.UnsupportedOperationException: еще не реализовано

С printStackTrace: вы также знаете, что вызвало его (номера строк + стек вызовов)

java.lang.UnsupportedOperationException: еще не реализовано
    в javaapplication27.Test1.test(Test1.java:27)
    в javaapplication27.Test1.main(Test1.java:19)

public static void main(String[] args){
    try {
        test();
    } catch (UnsupportedOperationException e) {
        System.out.println(e);
        e.printStackTrace();
    }
}

private static void test() {
    throw new UnsupportedOperationException("Not yet implemented");
}

Ответ 2

Если вы используете System.out.println, вы сбрасываете свои ошибки в stdout, а не stderr.

Это традиционно, чтобы сбрасывать ошибки в стандартную ошибку, поэтому вы можете фильтровать нормальный успешный вывод из вывода ошибки. Это обычная практика для утилит командной строки и, следовательно, хорошая идея следовать.

например.

myCommand 2> /tmp/errors > /tmp/results

будет записывать ошибки в один журнал, а результаты - в другой. В зависимости от вашего процесса оболочки/вызова и т.д. Вы можете объединить эту информацию, выбросить ошибки, отреагировать, если возникнут какие-либо ошибки и т.д. См. здесь для более Информация.

Использование printStackTrace() - хорошая идея, так как вы сбрасываете место, где происходило исключение. Это часто неоценимо для отслеживания ошибок, которые являются неожиданными, поскольку он даст вам прямой (если подробный) указатель на то, где именно вы столкнулись с ошибкой.

Ответ 3

System.out.println(e) эквивалентен System.out.println(e.toString()): System.out - это PrintStream, PrintStream.println(Object o) вызывает PrintStream.println(o.toString()).

e.toString() возвращает имя класса, а исключение - getLocalizedMessage().

e.printStackTrace() записывает эту информацию в System.err(не System.out), а также трассировку стека, то есть цепочку методов, которая привела к исключению. Это полезная информация.

Я часто думал, что было бы неплохо, если бы был метод, который возвращает строку, содержащую информацию, которая выводится e.printStackTrace(). Поскольку вам не нужно использовать e.getStackTrace() и написать свою собственную процедуру для вывода результирующего массива StackTraceElements.

Ответ 4

System.out.println(e) не даст вам вашей трассировки стека, просто сообщение об ошибке и тип исключения, а также будет напечатано на стандартный вывод, а не на выход ошибки.

Ответ 5

Программа Bellow показывает информацию о различиях

System.out.println(е);: - показывает только исключение. e.g.java.lang.ArithmeticException:/нолем    e.printStackTrace();: -, где указаны детали исключения и где вызвать исключение в программе с номером строки, например. java.lang.ArithmeticException:/нолем в test.Test.main(Test.java:7)

пакетный тест;

Открытый класс Test {

public static void main(String args[]) {
    try {
        System.out.println(12 / 0);

    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
    }

}

}