PrintWriter y PrintStream nunca lanzan IOExceptions

Hace algunos días me di cuenta de que PrintWriter (así como también PrintStream ) nunca lanza una IOException al escribir, enrojar o cerrar.

En su lugar, establece un indicador interno ( trouble=true ) cuando ocurre un error.
No es posible obtener la excepción exacta, pero solo si hubo alguna excepción ( checkError () ).

Mi pregunta es: ¿por qué querría uno tener tal comportamiento? ¿No es ese mal diseño de API?

Creo que dado que System.out y System.err son instancias de PrintStream , se proporcionó un manejo de errores más relajado. Probablemente, como lo mencionaron otros carteles, fue para allanar el camino para los que pasaron de C / C ++ hacia 1995. Cuando se agregó la API Reader / Writer, se creó PrintWriter para que sea paralelo al PrintStream existente.

Una aplicación donde este comportamiento es extremadamente deseable es el registro. El registro es accesorio a una aplicación más grande. Normalmente, si el registro falla, no se quiere que falle toda la aplicación. Por lo tanto, tiene sentido que System.err , al menos, ignore las excepciones.

Me pregunto si es porque IOExceptions está marcado, esto requeriría que coloques un bloque try catch alrededor de cada System.out. llamada.

actualización: O a arroja su firma de método.

Eso sería molesto muy rápido.

Realmente no conozco la historia, pero creo que fue para hacer que Java sea más fácil para los progtwigdores más nuevos, que los diseñadores querían poder usar métodos simples de impresión de stdio sin la necesidad de saber qué excepciones existen. Entonces, en ese sentido, es un buen diseño (aunque estoy de acuerdo con usted).

Sun / Oracle debería haber agregado dos funciones escritas, una que arroje una IOException y otra que no arroje nada.

Es posible que el diseño haya sido realizado por alguien que proviene de un fondo C donde los errores stdio se manejan de manera similar. Como estoy acostumbrado a ese paradigma, no lo llamaría malo, pero estaría de acuerdo en que es inconsistente.

También estoy de acuerdo con el comentario sobre tratar de hacer que PrintWriter sea más fácil de usar. Las clases de IO en Java son confusas (al menos para todos los que conozco) y tal vez alguien solo estaba tratando de hacer la vida un poco más fácil.