Excepciones personalizadas en Java

Iniciado por Expermicid, Octubre 14, 2013, 02:51:51 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Java usa excepciones para proveer manejo de errores a sus programas.
Se pueden definir excepciones propias en Java, no hay por qué limitarse a las predefinidas, bastará con que la clase extienda de la clase Exception y proporcionar la funcionalidad para el tratamiento de esa excepción.

Supongamos que tenemos que crear una clase DataBag, la cual tiene un numero máximo de elementos y permite almacenar cualquier tipo de objetos.
Y debemos definir dos métodos:
- add() para permitir agregar elementos a la bolsa y en el caso de que la misma este llena dispare la excepción FullDataBagException.
- remove() para remover elementos de la bolsa y en el caso de que la misma este vacía se dispare la excepción EmptyDataBagException

Las dos excepciones FullDataBagException y EmptyDataBagException son excepciones chequeadas que deben ser creadas por nosotros como subclase de Exception.

Para ello creamos la Clase DataBag.

Código: java
import java.util.ArrayList;

public class DataBag {

// Variables
private final int limiteMaximo = 5;
private ArrayList<Object> lista = new ArrayList<Object>();

// Constructor
public DataBag() {
super();
}

// Getter y Setter
public int getLimiteMaximo() {
return limiteMaximo;
}
public void setLista(ArrayList<Object> lista) {
this.lista = lista;
}
public ArrayList<Object> getLista() {
return lista;
}

// Metodo Add()
public void add(Object agregar) {

}

// Metodo Remover()
public void remover() {

}

}


Ya tenemos el esqueleto de la clase. En donde ponemos el limite de objetos que se pueden guardar y usamos un ArrayList para almacenar los objetos.
Los metodos Add() y Remover() los haremos despues.
Vamos a crear las excepciones, para ello creamos una clase llama FullDataBagException que extienda a Exception y lo mismo con EmptyDataBagException.

Código: java
public class FullDataBagException extends Exception {

// Constructor
public FullDataBagException() {
super();
}

}


Código: java
public class EmptyDataBagException extends Exception {

// Constructor
public EmptyDataBagException() {
super();
}

}


En ellas vamos a sobreescribir el metodo getMessage para imprimir un mensaje adecuada a cada caso.
En el caso de FullDataBagException tiene que notificarse que no hay mas espacio y en EmptyDataBagException que no hay elementos.
Nos quedaria asi.

Código: java
public class FullDataBagException extends Exception {

// Constructor
public FullDataBagException() {
super();
}

// Metodo getMessage
@Override
public String getMessage() {
     return "La cola no tiene espacion disponible.";
}

}


Código: java
public class EmptyDataBagException extends Exception {

// Constructor
public EmptyDataBagException() {
super();
}

// Metodo getMessage
@Override
public String getMessage() {
     return "La cola no tiene elementos.";
}

}


Ahora si haremos los metodos de la clase DataBag.

En el metodo Add():

- Primero que nada se usa la clausula throws para declarar el tipo de excepción que lanza.
- Con un if verificamos si hay espacio para guardar el nuevo objeto. Si la hay se guarda, en caso contrario se genera una nueva excepcion FullDataBagException y se lanza con throw.

Código: java
// Metodo Add()
public void add(Object agregar) throws FullDataBagException {
if (this.getLista().size() == this.getLimiteMaximo()) {
throw new FullDataBagException();
} else {
this.getLista().add(agregar);
}
}


Y con el metodo Remover():

- Se usa la clausula throws para declarar el tipo de excepción que lanza.
- Con un if verificamos si hay objetos para eliminar. Si la hay se elimina el que esta en la posicion 0, en caso contrario se genera una nueva excepcion EmptyDataBagException y se lanza con throw.

Código: java
// Metodo Remover()
public void remover() throws EmptyDataBagException {
if (this.getLista().size() == 0) {
throw new EmptyDataBagException();
} else {
this.getLista().remove(0);
}
}


Probemoslo.

- En el caso de que queramos eliminar un elemento y no la haya.



- Si queremos guardar mas elemento del limite permitido.



Funcionan, luego podemos usar try...catch para capturarlas.

Saludos