В чём разница между printStackTrace () и System.out.println(exception.getMessage())?

Рейтинг: 2Ответов: 2Опубликовано: 13.01.2023

Предположим, я обрабатываю исключение и в блоке catch просто вывожу сообщение об ошибке.

Я могу это сделать так:

try{

//Какой-то код

} catch(IOException exception){
   exception.printStackTrace();
}

Но могу сделать и так:

try{

//Какой-то код

} catch(IOException exception){
   System.err.println(exception.getMessage());
}

В чём разница этих двух способов? И какой лучше использовать?

Ответы

▲ 1Принят

Собрал ответ из всех комментариев под вопросом: по кусочку информации из того, из этого и наконец понял, в чём разница.

Возьмём вот такой код:

import java.io.File;
import java.io.PrintWriter;
import java.io.IOException;

public class Test {

    public static void main(String args[]) {
         File file = new File("C:" + File.separator + "someFile.txt");
         try(PrintWriter writer = new PrintWriter(file)){
             
             writer.println("something....");

         } catch (IOException e){
              //Здесь будем выводить сообщение об ошибке
         }
    }
}
  1. printStackTrace(). В блоке catch пропишем:
} catch (IOException e){
   e.printStackTrace();
}

В случае, если исключение произойдёт, то на экран будет выведен стектрейс + сообщение об ошибке:

java.io.FileNotFoundException: C:/someFile.txt (No such file or directory)
    at java.base/java.io.FileOutputStream.open0(Native Method)
    at java.base/java.io.FileOutputStream.open(FileOutputStream.java:293)
    at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:235)
    at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:184)
    at java.base/java.io.PrintWriter.<init>(PrintWriter.java:309)
    at Test.main(Test.java:9)

И сообщение об ошибке, и стектрейс. Два в одном.

  1. System.err.println(e.getMessage()). Если прописать в блоке catch это:
} catch (IOException e){
   System.err.println(e.getMessage());
}

То на экран будет выведено только сообщение об ошибке, без стектрейса (то есть без списка методов, кто кого вызвал):

C:/someFile.txt (No such file or directory)

Вывод

Исключения нужно конечно нормально обрабатывать, но если всё-таки по какой-то причине вы хотите вывести информацию об исключении в консоль, то пишите e.printStackTrace(), ведь это выводит более полную информацию, чем System.err.println(e.getMessage()).

Спасибо всем, кто писал в комментариях или отвечал!

▲ 1

Имхо - и то и другое неправильно. Ошибки надо логировать, а не выкидывать в консоль.

Так же плохо System.out, так как для вывода ошибок есть System.err.

printStackTrace как раз и выводит стек ошибки в стандартный системный поток для ошибок. Т.е. System.err