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.
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.
public class FullDataBagException extends Exception {
// Constructor
public FullDataBagException() {
super();
}
}
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.
public class FullDataBagException extends Exception {
// Constructor
public FullDataBagException() {
super();
}
// Metodo getMessage
@Override
public String getMessage() {
return "La cola no tiene espacion disponible.";
}
}
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.
// 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.
// 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.
(http://i.imgur.com/juRkgMb.png)
- Si queremos guardar mas elemento del limite permitido.
(http://i.imgur.com/7PdKyXj.png)
Funcionan, luego podemos usar try...catch para capturarlas.
Saludos