Cuando trabajamos con entradas y salidas de datos es muy probable que nos encontremos con más de una IOException
. En estos casos, puede ser que la información proporcionada por el «stack trace» de la Excepción no nos de la información sobre el punto de manipulación en el cual se ha producido dicha excepción. Es por ello que vamos a ver en este artículo cómo personalizar IOException.
IOException
es una excepción que se produce cuando estamos manipulando la entrada/salida de datos, ya sea por leerlos en consola, cuando accedemos a un fichero,… En estos casos siempre estaremos obligados a controlar la posibilidad de que se produzca la IOException
. Para ello utilizaremos el bloque try-catch. Por ejemplo escribiremos el siguiente código para controlar la IOException
en una lectura de datos por consola.
BufferedReader br; br = new BufferedReader(new InputStreamReader(System.in)); String texto; try{ br.readLine()); } catch (IOException ioe){ ioe.printStackTrace(); }
Vemos que en el caso de que se produzca la IOException
lo que hemos hecho es invocar al método .printStackTrace()
para volcar la traza de ejecución de la manipulación de datos, lo que nos ayudará a encontrar la línea en la que se produjo la excepción.
En este punto vamos a ver cómo podemos personalizar IOException para añadir algo más de información. Es cierto que podríamos crear una excepción personalizada que extendiese la IOException
.
public class MiExcepcion extends IOException { ... }
Si bien, si no queremos manipular mucha información extra, quizás nos sea más sencillo personalizar IOException para añadir la información que necesitemos. Para ello lo que haremos será, cuando se produzca la IOException
la relanzaremos mediante la sentencia throw.
try { ... } catch(IOException ioe){ throw new IOException("Error en la lectura del fichero",ioe); }
Vemos que lo que hacemos es crear una nueva excepción IOException
, pero en este caso le añadimos un mensaje con la información personalizada que queramos y la propia excepción. Es por ello que tendremos que volver a controlarla en el método en el que la estemos utilizando. En este caso mediante la sentencia throws
. Veamos cómo sería en el caso de querer leer las líneas de un fichero:
public static long numeroLineas(String fichero) throws IOException { long lNumeroLineas = 0; try{ FileReader file = new FileReader(fichero); BufferedReader bf = new BufferedReader(file); while ((bf.readLine())!=null) { lNumeroLineas++; } bf.close(); } catch(IOException ioe) { throw new IOException("Error en la lectura del fichero",ioe); } return lNumeroLineas; }
Lógicamente el punto en el que llamemos a este método tendremos que volver a capturar la IOException
. En ese punto podemos invocar al método .getMessage()
para poder recuperar el texto con el que hemos personalizado la excepción.
public static void main(String[] args) { String fichero = "datos.txt"; try { numeroLineas(fichero); } catch (IOException ioe) { System.out.println(ioe.getMessage()); ioe.printStackTrace(); } }
De esta forma sencilla podremos tener una pequeña forma de personalizar IOException y añadir un mensaje adicional de información.