Programming
T03-004-02 - Excepciones: delegar mediante throws
Enunciado
En ocasiones, en lugar de capturar la excepción en el momento en el que se produce, nos interesará "lanzar" la excepción hacia el método invocante.
Cuando un método utiliza una sentencia que puede generar una excepción, pero dicha excepción no es capturada y tratada por él, sino que se encarga su gestión a quién llamó al método, decimos que se ha producido delegación de excepciones.
Para establecer esta delegación, en la cabecera del método se declara el tipo de excepciones que puede generar y que deberán ser gestionadas por quien invoque a dicho método. Utilizaremos para ello la sentencia
throwsy tras esa palabra se indica qué excepciones puede provocar el código del método. Si ocurre una excepción en el método, el código abandona ese método y regresa al código desde el que se llamó al método. Allí se posará en elcatchapropiado para esa excepción.Ejemplo:
Hemos modificado el ejemplo sobre captura de excepciones para que la lectura de los datos se realice en un método propio, aunque la captura de la excepción sigue estando en el método
main, ya que el nuevo métodoleeTecladodelega la gestión de las excepciones conthrows.
/*
* Ejercicio resuelto sobre manejo de excepciones.
* El programa solicita que el usuario introduzca por teclado
* un número entre 0 y 100, debiendo gestionarse la entrada
* por medio de excepciones.
*/
import java.io.*;
public class ejercicio_resuelto_excepciones {
public static void main(String[] args){
int numero=-1;
int intentos=0;
String linea;
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
do{
try{
System.out.print("Introduzca un número entre 0 y 100: ");
numero = leeTeclado(teclado);
}catch(IOException e){
System.out.println("Error al leer del teclado.");
}catch(NumberFormatException e){
System.out.println("Debe introducir un número entre 0 y 100.");
}finally{
intentos++;
}
}while (numero < 0 || numero > 100);
System.out.println("El número introducido es: " + numero);
System.out.println("Número de intentos: " + intentos);
}
private static int leeTeclado(BufferedReader teclado) throws NumberFormatException, IOException {
String linea = teclado.readLine();
int numero = Integer.parseInt(linea);
return numero;
}
}Ejercicio:
En el ejemplo correspondiente al apartado Leer del teclado, se muestra la calificación en el módulo de Programación que introduce el usuario por teclado:
import java.util.Scanner;
public class LecturaTeclado {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int miCalificacion = 0;
System.out.println("Dime la nota que me corresponde:");
miCalificacion = sc.nextInt();
System.out.println("Mi nota en PROGRAMACION es: " + miCalificacion);
}
}Modifica el código anterior incluyendo un método leeTeclado, que delegue la excepción InputMismatchException al método main en el caso de que el usuario introduzca un valor float.
Solución
package lecturateclado;
import java.util.Scanner;
import java.util.InputMismatchException;
public class LecturaTeclado {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int miCalificacion = 0;
System.out.println("Dime la nota que me corresponde:");
try {
miCalificacion = leeTeclado(sc);
} catch (InputMismatchException ime) {
System.out.println("Debe introducir un numero entero:");
}
System.out.println("Mi nota en PROGRAMACION es: " + miCalificacion);
}
static int leeTeclado(Scanner sc) throws InputMismatchException{
int miCalificacion;
miCalificacion = sc.nextInt();
return miCalificacion;
}
}
Input
10.5
20.5
Output
Dime la nota que me corresponde: Debe introducir un numero entero: Mi nota en PROGRAMACION es: 0
Dime la nota que me corresponde: Debe introducir un numero entero: Mi nota en PROGRAMACION es: 0

