2011-04-28 11 views
13

Necesito ayuda para comprender IOException. Revisé mucha información en Internet y revisé las especificaciones técnicas en el sitio web Java de Oracle.Comprensión de IOException de Java

¿Tengo razón en mi comprensión de la clase IOException y de todas sus subclases, de que no hay ningún "mensaje de error" asociado o valores de "código de retorno" asociados?

Entonces, si uno quisiera emitir algún mensaje y/o devolver el valor del código, tendría que insertarlos con la lógica de captura IOException?

Si lo anterior es cierto, ¿cómo separaría las distintas subclases IOException?

p. Ej. Si la aplicación detectó una IOException, ¿qué tipo de IOException es? Fin de archivo, archivo cerrado, archivo no encontrado, archivo en uso, etc.

Respuesta

17

No hay valores de "código de retorno" en las excepciones (en general), pero sí contienen mensajes de error. Y debe manejarlos en los bloques catch, donde puede especificar el tipo de excepción que desea manejar. Puede tener varios bloques catch después de un bloque try, para manejar diferentes tipos de excepciones de manera diferente. Los bloques catch se invocarán en el orden especificado, y el primero con un tipo de parámetro adecuado manejará la excepción. Por lo tanto, primero debe buscar los tipos de excepción más específicos, luego los más generales.

ejemplo simplista:

try { 
    ... 
    throw new FileNotFoundException("This is an error message"); 
    ... 
} catch (FileNotFoundException e) { 
    System.out.println("File not found: " + e.getMessage()); 
    ... 
} catch (EOFException e) { 
    System.out.println("End of file reached: " + e.getMessage()); 
    ... 
} catch (IOException e) { // catch all IOExceptions not handled by previous catch blocks 
    System.out.println("General I/O exception: " + e.getMessage()); 
    e.printStackTrace(); 
    ... 
} 

Como se puede ver en el último bloque catch, excepciones almacenar el seguimiento de la pila de su origen, que puede ser impreso. Sin embargo, generalmente no es una buena idea imprimir dichos mensajes directamente como aquí; en el código de producción real, generalmente desea registrar estos mensajes utilizando un marco de trabajo de registro o mostrar (partes adecuadas de) ellos en una UI.

1

Puede determinar qué clase es una excepción o cualquier objeto usando instanceof. Sin embargo, para excepciones, usaría un bloque catch.

} catch(FileNotFoundException e) { 
    // file not found handling 

} catch(EOFException e) { 
    // handle reaching the End-Of_File. 

} catch(IOException e) { 
    // generic IOException handling for any other IOException. 

} 
1

Con el fin de procesar las subclases de IOException diferente, usted tiene que coger de forma individual, así:

try { 
    // some code that may throw an exception 
} 
catch (EOFException e) { 
    // handle an end-of-file exception here) 
} 
... 
catch (IOException e) { 
    // handle an IOException that's not covered in previous catch statements 
} 
catch (Exception e) { 
    // handle any other kind of exception 
} 
3

no hay códigos de error, pero muy a menudo no son mensajes. Por ejemplo, pueden contener el nombre del archivo u otros detalles que lo ayuden a identificar qué salió mal.

Consulte las subclases de IOException para obtener más ideas sobre las excepciones que puede obtener.

Para manejarlos, puede usar diferentes catch frases. Recuerde pasar de las excepciones menos específicas (si detecta IOException en el primer bloque, los bloques más específicos como FileNotFoundException nunca funcionarán). A veces es posible que desee atraparlos a todos con un solo catch (IOException) - si no necesita manejar las subclases de una manera diferente.

try { 
    // ... 
} catch (FileNotFoundException e) { 
    // ... 
} catch (IOException e) { 
    // ... 
} 
2

Debería pensar qué excepciones quiere manejar de una manera específica (no con un bloque catch all). Una vez que ha encontrado sus candidatos, debe atraparlos de acuerdo con el árbol de herencia, el más específico primero y luego el más general (de subclases a superclases).Tenga en cuenta que si su lista negra contiene demasiadas excepciones que deben capturarse y pertenecen a una sola prueba, debería considerar dividir ese bloque de intentos en piezas más pequeñas.