e.printStackTrace() заменяет throw?

295
05 ноября 2017, 16:12

Часто встречаю подобный код:

Scanner in = null;
try {
  in = new Scanner(new File(FILE_NAME));
} catch (FileNotFoundException e) {
  e.printStackTrace();
}
if (in.hasNext()) {

В случае исключения вызовется e.printStackTrace();, что выведет ошибку в stderr, но ведь дальнейшее выполнение метода продолжится с некорректным состоянием?

Answer 1

Представленный в вопросе код плох в любом случае:

  1. Если исходное исключение важно (например, этот метод в библиотеке и вызывается извне), то, вероятно, разработчики, использующие эту библиотеку, "отвесят низкий поклон" её создателям за невозможность обработать исключение так как им надо и за довольствование stacktrace-ом в stderr

  2. Если исключение не важно (важен только результат), то тут всё равно вместо результата будет NullPointerException, который ещё и непонятно на каком уровне будет обработан. Даже если вызывающая сторона обладает знанием (из документации или магическим образом) того что нужно отлавливать NullPointerException и показывать при этом пользователю сообщение "Файл не найден", то при наличии в методе других потенциальных мест возникновения NullPointerException, эта логика рискует оказаться сломанной

К каким выводам можно прийти:

  1. Если метод используется в библиотеке, то имеет смысл пробрасывать исходное исключение (возможно, в какой-то обёртке). Даже если с точки зрения бизнес-логики важен только результат, то для отладки исключение вполне может понадобиться
  2. Если метод является внутренним для программы, то тут уже "на вкус и цвет". Где-то имеет смысл "проглотить" исключение и сделать в catch, например, return null (или дальнейшую логику с in обернуть в if (in != null), если возникшее исключение - ещё не повод прекращать работу метода), где-то - пробросить вверх и обработать, например, глобально
Answer 2

Все правильно, если в блоке catch (Exception e) происходит обработка исключительной ситуации. Метод printStackTrace() выводит трассировку ошибки на экран. В данном блоке Вам необходимо либо аварийно завершить программу

System.exit(-1)

Или же предпринять действия, чтобы в дальнейшем программа корректно завершила работу.

Answer 3

Некорректного состояния не будет, так как ссылка будет указывать на null, следовательно if (in.hasNext()) выбросит вам исключение в рантайм NullPointerException

READ ALSO
Ошибка версии приложения; Error “application_version”

Ошибка версии приложения; Error “application_version”

При запуске выскакивают ошибки:

394
Создание таблицы SQLite нажатием кнопки

Создание таблицы SQLite нажатием кнопки

Добрый деньПодскажите, каким образом можно создать таблицу методом onClick? Например я создаю школьное расписание, и при первом входе в приложение...

260
Не могу получить appender из log4s.property

Не могу получить appender из log4s.property

Подскажите как получить все аппендеры из log4jproperty?

261
запустить python-скрипт через терминал, Java

запустить python-скрипт через терминал, Java

Не запускается python-скрипт, путь к файлу правильныйТа же самая команда запускается через терминал вручную

245