Это может остаться незамеченным. К сожалению, не существует простого решения «один размер подходит всем».

у программу на Java, которая читает файл слов. Программа в решающей степени зависит от этого файла, поэтому я действительно хочу, чтобы программа заканчивалась, если по какой-либо причине при чтении файла возникает IOException.

Какой лучший способ закончить программу? Я думаю, что вынужден окружить чтение файла внутри блока try / catch, поэтому я должен добавитьSystem.exit(0) в моем улове? Например, я должен сделать что-то вроде следующего?

try {
  BufferedReader br = new BufferedReader(new FileReader("myfile.txt"));
  String line;
  while ((line = br.readLine()) != null) {
    // process...
  }
} catch(IOException e) {
  System.out.println("Error: " + e);
  System.exit(0); // ???
}

Ответы на вопрос(1)

Решение Вопроса

main() Метод, программа закончится. Там нет необходимости звонитьSystem.exitпросто разрешите исключению пузыриться в стеке естественным образом (добавивthrows IOException) к необходимым методам.

Редактировать: Как отметил @Brian, вы можете пойматьIOException в вашейmain метод и вызовSystem.exit вместо этого выдается читаемое человеком сообщение об ошибке (следы стека могут напугать людей). Также, как сказал @MeBigFatGuy, вызовSystem.exit изнутри вашего стека кода это плохая практика и ограничивает возможность повторного использования кода. Если вы должны использоватьSystem.exit, а затем держать его внутри телаmain метод.

 Femaref30 мая 2011 г., 02:11
Вы все еще можете позволить этому всплыть на главную и обеспечить универсальную попытку / поймать там и завершить программу изящно.
 grautur30 мая 2011 г., 02:14
Так что, если я правильно понимаю, я позволил исключению всплыть, удалив блок try / catch и добавив к этому методу «throws IOException» (и методы, которые вызывают этот метод и т. Д.)? Я чувствую себя немного непристойно, потому что теперь мне нужно добавить кучу «бросков IOException» везде - моя заблуждение введено в заблуждение?
 Brian Roach30 мая 2011 г., 02:08
На самом деле, есть очень веская причина, чтобы позвонитьSystem.Exit; вернуть значимый код завершения и лучшее сообщение об ошибке, чем трассировка стека.
 MeBigFatGuy30 мая 2011 г., 02:08
это дает дополнительное преимущество: если какая-то другая программа захочет повторно использовать ваш код, вы не убьете эту программу. Эта программа может решить для себя, что делать с исключением.
 Ted Hopp30 мая 2011 г., 02:09
Единственная причина этого не делать, если вы хотите выйти с удобным для пользователя сообщением, а не с некрасивой трассировкой стека. Трассировка стека, тем не менее, может предоставить лучшую диагностическую информацию.

Ваш ответ на вопрос