La librería o API de Java proporciona gran cantidad de clases que manejan casi cualquier tipo de excepción, pero no estamos obligados a utilizar solo esas clases sino que podemos crear nuestras propias excepciones.
Si queremos crear una excepción no verificada debemos heredar de RuntimeException y si queremos que sea verificada deberemos heredar de Exception o de alguna de sus subclases.
Veamos con un ejemplo como crear una clase que herede de Exception, luego en otra clase lanzar una excepción de la nueva clase creada y finalmente llamar al método que lanza la excepción.
Problema:
Confeccionar una clase que administre una lista tipo pila (se debe poder insertar, extraer e imprimir los datos de la pila).
En el método extraer lanzar una excepción si la pila se encuentra vacía, crear una excepción propia que herede de Exception.
Clase: PilaVaciaException
public class PilaVaciaException extends Exception {
public PilaVaciaException(String mensaje) {
super("Problema:" + mensaje);
}
}
La clase 'PilaVaciaException' hereda de la clase 'Exception', esto significa que quien lance una excepción de este tipo luego deberá ser capturada en forma obligatoria.
Clase: Pila
public class Pila {
class Nodo {
int info;
Nodo sig;
}
private Nodo raiz;
public Pila() {
raiz = null;
}
public void insertar(int x) {
Nodo nuevo;
nuevo = new Nodo();
nuevo.info = x;
if (raiz == null) {
nuevo.sig = null;
raiz = nuevo;
} else {
nuevo.sig = raiz;
raiz = nuevo;
}
}
public int extraer() throws PilaVaciaException {
if (raiz != null) {
int informacion = raiz.info;
raiz = raiz.sig;
return informacion;
} else {
throw new PilaVaciaException("No hay mas elementos en la pila");
}
}
public boolean vacia() {
return raiz == null;
}
public static void main(String[] ar) {
Pila pila1 = new Pila();
pila1.insertar(10);
pila1.insertar(40);
pila1.insertar(3);
try {
while (!pila1.vacia())
System.out.println("Extraemos de la pila:" + pila1.extraer());
System.out.println("Extraemos de la pila:" + pila1.extraer());
} catch (PilaVaciaException ex) {
System.out.println(ex.getMessage());
}
}
}
El método 'extraer' lanza una excepción de tipo 'PilaVaciaException' en caso que la pila se encuentre vacía:
public int extraer() throws PilaVaciaException {
if (raiz != null) {
int informacion = raiz.info;
raiz = raiz.sig;
return informacion;
} else {
throw new PilaVaciaException("No hay mas elementos en la pila");
}
}
En la main donde creamos un objeto de la clase 'Pila' insertamos 3 enteros:
Pila pila1 = new Pila();
pila1.insertar(10);
pila1.insertar(40);
pila1.insertar(3);
Seguidamente dentro de un bloque try/catch atrapamos si ocurre una excepción de tipo 'PilaVaciaException', esto ocurre cuando finaliza el while y volvemos a llamar al método extraer, siendo que la pila se encuentra vacía:
try {
while (!pila1.vacia())
System.out.println("Extraemos de la pila:" + pila1.extraer());
System.out.println("Extraemos de la pila:" + pila1.extraer());
} catch (PilaVaciaException ex) {
System.out.println(ex.getMessage());
}
Tenemos una salida similar a esta:

Problema propuesto
Plantear una clase llamada 'Termometro' que defina un atributo llamado temperatura. Lanzar una excepción propia llamada 'TemperaturaFueraRangoException' si se intenta fijar una temperatura con un valor menor a -192 o superior a 100.
public class TemperaturaFueraRangoException extends Exception {
public TemperaturaFueraRangoException(String mensaje) {
super(mensaje);
}
}
public class Termometro {
private float temperatura;
public Termometro(float temperatura) throws TemperaturaFueraRangoException {
if (temperatura < -192 || temperatura > 100)
throw new TemperaturaFueraRangoException("La temperatura esta fuera del rango [-192,100]");
this.temperatura = temperatura;
}
public void fijarTemperatura(float temperatura) throws TemperaturaFueraRangoException {
if (temperatura < -192 || temperatura > 100)
throw new TemperaturaFueraRangoException("La temperatura esta fuera del rango [-192,100]");
this.temperatura = temperatura;
}
public void imprimir() {
System.out.println("La temperatura actual del termometro es " + temperatura);
}
public static void main(String[] args) {
try {
Termometro termometro1 = new Termometro(30);
termometro1.imprimir();
termometro1.fijarTemperatura(-250);
termometro1.imprimir();
} catch (TemperaturaFueraRangoException ex) {
System.out.println(ex.getMessage());
}
}
}
No hay comentarios:
Publicar un comentario