read example java exception ioexception

example - import inputstream java



¿Por qué se declara InputStream.close() para lanzar IOException? (4)

En el caso de la lectura de flujo de entrada de un sistema de archivos, se puede generar un error mientras el sistema de archivos actualiza los últimos metadatos de tiempo de acceso , o algunos otros metadatos, en un archivo durante el cierre. De todos modos, esto sucede casi nunca en la práctica.

En el caso de una lectura de flujo de entrada desde una conexión de red, un error en el cierre es un poco más concebible. Un cierre normal de un socket de red en realidad implica una solicitud de cierre (paquete TCP / IP FIN) que se envía a través de la conexión y se espera a que el otro extremo acuse recibo de esta solicitud de cierre. (De hecho, el otro extremo de la conexión a su vez envía una solicitud de cierre, que el extremo de cierre confirma). Por lo tanto, en el caso de un flujo de entrada de socket, una operación de cierre en realidad implica el envío de tráfico a través de la conexión y, por lo tanto, el cierre puede Falla con un error.

Tenga en cuenta que en muchas implementaciones, close() generalmente no lanza una IOException si la secuencia ya está cerrada; simplemente falla silenciosamente al cerrar la corriente nuevamente.

El método java.io.InputStream.close() se declara para lanzar una IOException . ¿Bajo qué circunstancias se lanzaría tal excepción?

Edición: Sí, he leído el javadoc. ¿Puede alguien ser más específico que "cuando se produce un error de E / S"? ¿Qué error de E / S puede ocurrir al cerrar un InputStream ?


Estoy buscando en el código fuente de Java, y he encontrado algo interesante que es indicativo de la razón IOException . InputStream es una clase abstracta . Por lo tanto, no podemos predecir el tipo de entrada que se cerrará, por lo que es bueno mantener la información en movimiento.

Cualquiera que sea el código que use ese flujo de entrada debe poder lanzar una IOException , porque existe la posibilidad de que el cierre del flujo de entrada pueda fallar. Si falla, lo que sea que esté usando la implementación debe saberlo, porque hay una buena posibilidad de que deba manejarse.

Es importante entender el diseño de la estructura de excepción en Java. Cada excepción, por supuesto, extiende la Exception . Sin embargo, también hay categorías más amplias de excepciones: java.lang.IOException es una de estas, y cubre todas las posibles excepciones de entrada / salida. Cuando decimos que ha habido un error de E / S, estamos haciendo referencia a cualquier cosa que caiga bajo la IOException . Como resultado, muchas excepciones se extienden a esta, por ejemplo, FileNotFoundException , EOFException , etc., ya que es importante contar con una excepción amplia y general para administrarlas.

Como resultado, cualquier clase de IO deberá ser capaz de lanzar cualquiera de las diversas IOExceptions al cierre. Por lo tanto, close() debe lanzar IOException , lo que le da a su implementación la capacidad de lanzar también cualquiera de las extensiones de IOException . Es por esto que close() lanza la IOException : las excepciones se heredan y usted debe poder acceder a cualquiera de las excepciones IOExceptions al cerrar una secuencia.

Aquí hay un par de escenarios que vale la pena destacar:

  • No puede cerrar un IOStream dos veces, aunque esto generalmente no produce una excepción si lo hace
  • El contenido se vuelve inaccesible (por ejemplo, se desmontó un disco) (El close() es realmente crítico para el sistema operativo, ya que debe tener un indicador de cuándo el archivo ya no está ocupado)
  • La fuente genérica ha cerrado
  • Cualquier falla genérica no cubierta por todas las otras subclases de IOException (por ejemplo, FileNotFoundException )

Puede verificar qué causó una IOException ejecutando Exception.getMessage() .


La llamada al sistema de cierre subyacente deberá realizarse eventualmente, por ejemplo, en linux http://linux.die.net/man/2/close . Esa llamada está documentada para fallar con EIO : "Ocurrió un error de E / S". Entonces, la razón es que la llamada de close sistema de archivos subyacente puede fallar.


Me he preguntado sobre esto y he investigado un poco sobre este tema hace unos años. Esto es lo que sé ...

Si observa el javadoc en el enlace que proporcionó, indica claramente que "el método de cierre de InputStream no hace nada", por lo que no hay forma de que produzca una excepción, ¿correcto? Pero luego, al observar todas las subclases de IOException, verá que hay muchas situaciones en las que es posible que las subclases de la corriente de entrada no puedan cerrar la secuencia. Así que mi mejor conjetura es que esta excepción está diseñada para que las subclases la utilicen.

http://docs.oracle.com/javase/6/docs/api/java/io/IOException.html

En algunos casos, no es más que una molestia, y en otros indica claramente que algo salió mal. Todo depende de qué tipo de implementación de flujo de entrada está utilizando.