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

PrintWriter и PrintStream никогда не бросают IOExceptions

Несколько дней назад я понял, что PrintWriter (а также PrintStream) никогда не бросать IOException при записи, очистке или закрытии.

Вместо этого он устанавливает внутренний флаг (trouble=true) при возникновении ошибки.
Невозможно получить точное исключение, но только , если было какое-то исключение (checkError()).

Мой вопрос: зачем нужно такое поведение? Разве это не плохой дизайн API?

4b9b3361

Ответ 1

Я думаю, что, поскольку System.out и System.err являются экземплярами PrintStream, была предоставлена ​​более расслабленная обработка ошибок. Вероятно, это было, как упомянуто другими плакатами, чтобы сгладить путь для тех, кто перешел с C/С++ около 1995 года. Когда был добавлен API Reader/Writer, PrintWriter был создан для параллельного существующего PrintStream.

Одним из приложений, где это поведение крайне желательно, является регистрация. Ведение журнала является вспомогательным для большего приложения. Как правило, если протоколирование завершается с ошибкой, не требуется, чтобы все приложение завершилось с ошибкой. Таким образом, имеет смысл System.err, по крайней мере, игнорировать исключения.

Ответ 2

Интересно, проверяется ли его, потому что IOExceptions проверены, для этого потребуется разместить блок catch try вокруг каждого System.out. звоните.

update: или броски в вашей сигнатуре метода.

Это очень раздражало бы.

Ответ 3

Я действительно не знаю эту историю, но я думаю, что это должно было сделать Java проще для более новых программистов, которые дизайнеры хотели использовать простые методы печати stdio без необходимости знать, что такое исключения. Так что в этом отношении это хороший дизайн (я согласен с вами несколько, хотя).

Ответ 4

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

Я также согласен с комментарием о попытке упростить использование PrintWriter. Классы ввода-вывода в Java запутывают (по крайней мере, для всех, кого я знаю), и, возможно, кто-то просто пытался сделать жизнь немного легче.

Ответ 5

Sun/Oracle должны были добавить две функции, подобные записи, которые бросают исключение IOException, а другое - ничего не бросает.