Ahora sí, vamos a ver cómo nos las arreglamos con las excepciones para que no se nos pare el programa con un mensaje tan poco estético...
En lugar de lanzar las excepciones al intérprete, vamos a procesarlas nosotros mediante la cláusula catch:
Archivo: Ejemplo11.java
Compilar con: javac Ejemplo11.java
Ejecutar con: java Ejemplo11 <nombre_archivo>
import java.io.*;
public class Ejemplo11 {
public static void main(String args[]) {
FileInputStream fptr;
DataInputStream f;
String linea = null;
try {
fptr = new FileInputStream(args[0]);
f = new DataInputStream(fptr);
do {
linea = f.readLine();
if (linea!=null) System.out.println(linea);
} while (linea != null);
fptr.close();
}
catch (FileNotFoundException e) {
System.out.println("Hey, ese archivo no existe!\n");
}
catch (IOException e) {
System.out.println("Error de E/S!\n");
}
}
}
También hicimos un cambio para elegir el archivo a imprimir desde la línea de comandos, en lugar de entrarlo fijo, utilizando para eso el argumento del método main(arg[]), que consiste en una lista de Strings
con los parámetros que se pasan en la línea a continuación de java nombre_programa. Por ejemplo, si llamamos a este programa con:
java Ejemplo11 archi.txt otro.xxx
arg[0] contendrá "archi.txt", arg[1] contendrá "otro.xxx", y así sucesivamente.
Por supuesto, si llamamos a Ejemplo11 sin parámetros se lanzará otra excepción al intentar accederlo:
C:\java\curso>java Ejemplo11
java.lang.ArrayIndexOutOfBoundsException: 0
at Ejemplo11.main(Ejemplo11.java:10)
Pero también podríamos capturarla!
Veamos un poquito cómo es esto de capturar excepciones.
La cláusula try engloba una parte del programa donde se pueden lanzar excepciones. Si una excepción se produce, Java busca una instrucción catch (nombre_de_la_excepción variable), y, si la encuentra, ejecuta lo que ésta engloba. Si no encuentra un catch para esa excepción, para el programa y muestra el error que se produjo.
Por ejemplo, para evitar este último error bastaría con agregar:
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Debe ingresar un nombre de archivo!");
System.out.println("Ej.: java Ejemplo11 pepe.txt");
}
Hay que notar que cuando se lanza una excepción el programa igual se detiene, porque el código que sigue al lanzamiento de la excepción no se ejecuta. Veremos luego cómo se comporta esto en un objeto que fue creado por otro, y cómo usar la instrucción finally para poner una parte de código que se ejecute pase lo que pase.