1. Vamos a construir un ejercicio completo de uso de excepciones. Para ello seguiremos los pasos que se indican a continuación:
javac Ej1.java java Ej1 20 4
public static void main(String[] args) { String param1=null, param2=null; int dividendo=0, divisor=0; try { param1 = args[0]; param2 = args[1]; } catch (ArrayIndexOutOfBoundsException e) { System.out.println ("Faltan parametros"); System.exit(-1); } ... System.out.println ("Resultado: " + divide(dividendo, divisor)); }
Prueba después la excepción capturada, ejecutando el programa con algo como:
java Ej1 20
Debería capturar la excepción y mostrar por pantalla el mensaje
"Faltan parametros".
public static void main(String[] args) { String param1=null, param2=null; int dividendo=0, divisor=0; ... try { dividendo = Integer.parseInt(param1); divisor = Integer.parseInt(param2); } catch (NumberFormatException e2) { System.out.println ("Formato incorrecto del parametro"); System.exit(-1); } System.out.println ("Resultado: " + divide(dividendo, divisor)); }
Prueba después la excepción capturada, ejecutando el programa con algo como:
java Ej1 20 hola
Debería capturar la excepción y mostrar por pantalla el mensaje
"Formato incorrecto del parametro".
public static void main(String[] args) { int dividendo=0, divisor=0; try { dividendo = Integer.parseInt(args[0]); divisor = Integer.parseInt(args[1]); } catch (ArrayIndexOutOfBoundsException e) { ... } catch (NumberFormatException e2) { ... } System.out.println ("Resultado: " + divide(dividendo, divisor)); }
Modifica el método main para dejarlo todo en un solo bloque try,
y vuelve a probar los distintos casos de fallo indicados antes, para ver
que el programa sigue comportándose igual.
public static int divide(int dividendo, int divisor) { if (divisor == 0) throw new IllegalArgumentException ("Divisor incorrecto"); ... }
java Ej1 20 0
¿Qué mensaje aparece? ¿Qué significa?
public static void main(String[] args) { ... try { System.out.println ("Resultado: " + divide(dividendo, divisor)); } catch (IllegalArgumentException e3) { e3.printStackTrace() } }
¿Qué mensaje aparece? ¿Qué significa?
public class NumeroNaturalException extends Exception { public NumeroNaturalException(String mensaje) { super(mensaje); } }
public static int divide(int dividendo, int divisor) { if (divisor == 0) throw new IllegalArgumentException ("Divisor incorrecto"); if (dividendo < 0 || divisor < 0) throw new NumeroNaturalException("La division no es natural"); ... }
- Prueba a compilar la clase. ¿Qué error te da? ¿A qué puede deberse?
- Para subsanarlo, hay que indicar en el método divide que dicho método puede lanzar excepciones de tipo NumeroNaturalException. Eso se hace mediante una cláusula throws en la declaración del método:
public static nt divide(int dividendo, int divisor) throws NumeroNaturalException { if(divisor == 0) throw new IllegalArgumentException ("Divisor incorrecto"); if (dividendo < 0 || divisor < 0) throw new NumeroNaturalException("La division no es natural"); ... }NOTA: esta cláusula sólo hay que introducirla para excepciones que sean de tipo checked, es decir, que se pueda predecir que pueden pasar al ejecutar un programa. Dichas excepciones son los subtipos fuera de RuntimeException, y cualquier excepción que podamos crear nosotros.
- Prueba a compilar la clase. ¿Qué error te da ahora? ¿Por qué?
- Lo que nos queda por hacer para terminar de corregir la clase es capturar la excepción que se lanza en el método divide, cuando utilizamos dicho método en el main:
public static void main(String[] args) { ... try { System.out.println ("Resultado: " + divide(dividendo, divisor)); } catch (IllegalArgumentException e3) { e3.printStackTrace() } catch (NumeroNaturalException e4) { System.out.println ("Error: " + e4.getMessage()); System.exit(-1); } }¿Para qué sirve la llamada a "getMessage()" (qué texto obtenemos con esa llamada)?
Nota que cuando hemos añadido antes la excepción IllegalArgumentException no ha habido que poner una cláusula "throws" en la declaración de "divide", ni capturar la excepción en el main para poder compilar, y sin embargo sí lo hemos hecho ahora para la NumeroNaturalException. ¿A qué se debe esta diferencia?
java Ej1 20 4 // 5 java Ej1 20 // "Faltan parametros" java Ej1 20 hola // "Formato incorrecto del parametro" java Ej1 20 0 // Excepción de tipo IllegalArgument java Ej1 20 -1 // "Error: La division no es natural"
PARA ENTREGAR