lunes, 17 de febrero de 2014

Práctica de creación de Jarras (Parte 2) Excepciones.

Bueno, Ahora vamos a retomar la práctica de las jarras pero con algunos cambios. Vamos a introducir las excepciones.
Para ello haremos lo siguiente:

1.- Modificar el programa principal para que en lugar de crear dos jarras con capacidad inicial fija de 5 y 7 litros cada una, sea posible pasar las capacidades iniciales de las dos jarras como parámetros de entrada al programa principal. Esto significa que las capacidades iniciales de las dos jarras podrán ser diferentes para cada llamada al programa. En este caso, se podrían producir las siguientes excepciones:
a) ArrayIndexOutOfBoundsException: si se intenta ejecutar el nuevo programa principal sin parámetros de entrada, o con menos parámetros de entrada de los necesarios.
b) NumberFormatException: si se intenta ejecutar el nuevo programa principal con parámetros que no sean numéricos.
c) RuntimeException: si se intenta ejecutar el nuevo programa principal con jarras que tengan capacidad 0 o negativa (suponiendo que en la versión anterior de la práctica se lanzaba esta excepción en el constructor de la clase Jarra cuando el parámetro capacidadInicial del constructor era 0 o un número negativo).

2.- Capturar desde el programa principal la excepción ArrayIndexOutOfBoundsException. Mostrar el siguiente mensaje al usuario:
ERROR: Use: TestJarra capacidadInicialJarra1 capacidadInicialJarra2

3) Capturar desde el programa principal la excepción NumberFormatException y mostrar el siguiente mensaje al usuario:
ERROR: Algún parámetro no es un número

4) Crear una excepción JarraCapacidadException que será lanzada por la clase Jarra cuando
la capacidad inicial de la Jarra sea menor o igual a 0 (en lugar de lanzar la excepción de tipo
RuntimeException).

5) Modificar el programa principal para capturar y manejar la excepción JarraException.

Aquí tenemos las soluciones ;)

Clase JarraCapacidadException:

@SuppressWarnings("serial")
public class JarraCapacidadException extends Exception{ 
 //Si fuera una excepcion no comprobada se usaria extends RunTimeException.
  public JarraCapacidadException() {
   super();
  }
  public JarraCapacidadException(String e) {
   super(e);
  }
 }
Nota: el @SuppressWarnings("serial") Lo que hace es que no nos de un molesto warning que no nos interesa. Solo eso;)

Clase JarraException:

public class JarraException {
 private final int capacidad;
 private int cantidad;
 
 public JarraException(int capacidadInicial) throws JarraCapacidadException{
  if (capacidadInicial<=0) throw new JarraCapacidadException("Error, capacidad incorrecta.");
  capacidad = capacidadInicial;
  cantidad = 0;
 }
 
 
 
 public int capacidad() {
  return capacidad;
 }
 
 public int cantidad() {
  return cantidad;
 }
 
 public void llena() {
  cantidad = capacidad;
 }
 
 public void vacia() {
  cantidad = 0;
 }
 
 public void llenaDesde(JarraException j){
  int cantidadMinima = Math.min(capacidad- cantidad, j.cantidad);
  
  cantidad   += cantidadMinima;
  j.cantidad -= cantidadMinima;
 }


 public String toString(){
  String frase = " capacidad de " + capacidad + " y cantidad de " + cantidad + " de líquido.";
  return frase;
 }
}

Clase TestJarraException:

public class TestJarraException {
 public static void main(String[] arg) throws Exception
 {
 try{
  JarraException jarraA = new JarraException(Integer.parseInt(arg[0]));
  JarraException jarraB = new JarraException(Integer.parseInt(arg[1]));
  jarraA.llena();
  jarraB.vacia();
  System.out.println("JA "+ jarraA.toString());
  System.out.println("JB "+ jarraB.toString());
  jarraB.llenaDesde(jarraA);
  jarraA.llena();
  jarraB.llenaDesde(jarraA);
  jarraB.vacia();
  jarraB.llenaDesde(jarraA);
  jarraA.llena();
  jarraB.llenaDesde(jarraA);
  System.out.println("JA "+ jarraA.toString());
  System.out.println("JB "+ jarraB.toString());
  } catch (JarraCapacidadException e) {
   System.out.println("ERROR: Use: TestJarra capacidadInicialJarra1 capacidadInicialJarra2");
  } catch (NumberFormatException e) {
   System.out.println("ERROR: Algún parámetro no es un número");
  } catch (RuntimeException e){
   System.out.println("Capacidad nula.");
   
  }
 }
 
}
Espero que le vayais pillando el truco a esto. No es difícil, sólo es ponerse ^^ Saludos ;)

No hay comentarios:

Publicar un comentario