PrintWriter и PrintStream никогда не бросают IOExceptions
Несколько дней назад я понял, что PrintWriter (а также PrintStream) никогда не бросать IOException при записи, очистке или закрытии.
Вместо этого он устанавливает внутренний флаг (trouble=true
) при возникновении ошибки.
Невозможно получить точное исключение, но только , если было какое-то исключение (checkError()).
Мой вопрос: зачем нужно такое поведение? Разве это не плохой дизайн API?
Ответы
Ответ 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, а другое - ничего не бросает.