PrintWriter и PrintStream никогда не генерируют исключения IOException - PullRequest
23 голосов
/ 18 ноября 2008

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

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

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

Ответы [ 5 ]

10 голосов
/ 18 ноября 2008

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

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

7 голосов
/ 18 ноября 2008

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

обновление: или добавление подписи вашего метода.

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

1 голос
/ 13 октября 2016

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

1 голос
/ 18 ноября 2008

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

0 голосов
/ 18 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...