una run remoto program por interrupción forzado existente conexión cannot bad java ioexception

run - java.io.ioexception se ha forzado la interrupción de una conexión existente por el host remoto



¿Alguna vez se lanza una excepción IOException? (6)

Después de proporcionar algunas respuestas aquí y leer algunos comentarios, parecería que, en la práctica, IOException nunca se cierra para el archivo de E / S.

¿Hay algún caso en el que las llamadas cerradas en un Stream / Reader / Writer realmente produzcan una excepción IOException?

Si realmente se lanza una excepción, ¿cómo debería tratarse?


Cuando suceda, debe manejarse como cualquier otra IOException , no ignorarse silenciosamente como se ve recomendado con tanta frecuencia. El supuesto es, supongo, que, dado que ha terminado de usar el flujo, no importa si se limpió correctamente.

Sin embargo, la limpieza adecuada es importante. Si una operación de close() genera una excepción, es probable que se trate de vaciar algunos resultados, realizar alguna transacción (en el caso de una conexión de base de datos que usted pensaba que era de solo lectura), etc., definitivamente no es algo que deba ignorarse. Y, como es raro, no está comprometiendo la confiabilidad de su aplicación de manera significativa al abortar la operación.


Es específicamente FileInputStream.close que no se lanza, incluso si su disco duro está en llamas. Presumiblemente es lo mismo para la entrada de socket. Para flujos de salida también puede estar vaciando. Hasta hace relativamente poco tiempo [ver las marcas de tiempo] BufferedOutputStream solía fallar al cerrar la secuencia subyacente si se lanzaba la flush .

(@MaartenBodewes quisiera que FileInputStream.close que FileInputStream.close no lanzar no está especificado por los documentos de la API. En el momento de la publicación era habitual eludir la cláusula mencionando que esto estaba relacionado con el Sun JDK (ahora conocido como Oracle JDK y OpenJDK). Parece que una reimplementación anterior oscura llamada Apache Harmony que usaba Android puede haber tenido un comportamiento diferente. Posiblemente otras implementaciones, o versiones de OpenJDK, también se pueden lanzar.


He encontrado dos casos:

  • Perder la conexión de red cuando todavía hay datos en el búfer para vaciar.
  • Hacer que el sistema de archivos se llene (o llegue a su límite de usuario para el tamaño del archivo) cuando todavía hay datos en el búfer para vaciar.

Ambos ejemplos dependen de que algo suceda mientras todavía hay datos en el búfer. Cerrar vacía el búfer antes de que se cierre el archivo, por lo que si se produce un error al escribir los datos en el archivo, se produce una excepción IOException.

Si ejecuta el siguiente código pasándole el nombre de un archivo para crearlo en una unidad de red, y luego, antes de presionar la tecla Intro, desenchufe el cable de red, el programa lanzará una excepción IOException.

import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Test { public static void main(final String[] argv) { final File file; file = new File(argv[0]); process(file); } private static void process(final File file) { Writer writer; writer = null; try { writer = new FileWriter(file); writer.write(''a''); } catch(final IOException ex) { System.err.println("error opening file: " + file.getAbsolutePath()); } finally { if(writer != null) { try { try { System.out.println("Please press enter"); System.in.read(); } catch(IOException ex) { System.err.println("error reading from the keyboard"); } writer.close(); } catch(final IOException ex) { System.err.println("See it can be thrown!"); } } } } }

Desde Java 7, puede usar try-with-resources para salir de este lío (se eliminó el código de generación de excepciones explícitas para la operación close() ):

private static void process(final File file) { try (final Writer writer = new FileWriter(file)) { writer.write(''a''); } catch (final IOException e) { // handle exception } }

esto manejará automáticamente las excepciones en close() y realiza una comprobación null explícita internamente.


Para los archivos, es posible que no vea la IOException lanzada a menudo en close (), pero definitivamente la verá para E / S que no sean archivos, como cerrar sockets a la red.

Aquí hay un ejemplo de un error de Java donde el cierre de un socket UDP causó que se lanzara una excepción IOException.


También he notado que PrintWriter ni siquiera tiene una cláusula de lanzamientos ...


Un examen de lo que puede suceder al llamar de cerca, cómo puede afectar la ocultación de excepciones y lo que puede hacer al respecto: publicación de blog .