El manejo de errores es una parte importante cuando estamos creando programas de cualquier tipo y en cualquier lenguaje. Java tiene una gran variedad de opciones para manejar errores, pero a veces es necesario crear nuestras propias excepciones para manejar errores que son propios de nuestra aplicación y que por ende, nadie más ha implementado.
En este post tomamos como ejemplo una clase que hace varias operaciones aritméticas, pero tenemos las siguientes reglas del negocio:
- Solo se pueden sumar y multiplicar números positivos
- No se puede dividir dentro de 0
Entonces vamos a crear 2 excepciones “personalizadas” para cumplir con esta lógica. Digamos que tenemos la implementación básica de la clase Aritmética.
package com.ricardogeek; public class Aritmetica { public int suma(int x, int y) { return x + y; } public int multiplica(int x, int y) { return x * y; } public int divide(int x, int y) { return x / y; } }
Esta clase no es exactamente lo que buscamos, vamos a crear 2 clases de excepción muy sencillas que se van a llamar:
- ExcepcionNumeroNegativo
- ExcepcionDivisionPorCero
Los pongo en español para mayor entendimiento, pero la convención de la industria sería que estuvieran en ingles (NegativeNumberException, DivideByZeroException).
package com.ricardogeek; import java.lang.Exception; public class ExcepcionNumeroNegativo extends Exception { public ExcepcionNumeroNegativo() { super("No se permiten numeros negativos."); } }
package com.ricardogeek; import java.lang.Exception; public class ExcepcionDivisionPorCero extends Exception { public ExcepcionDivisionPorCero() { super("No se permiten Dividir por cero."); } }
Estas son excepciones custom que heredan todo de la excepción básica Exception por defecto que viene en java, que a su vez hereda cosas de la clase Throwable por lo tanto nuestras excepciones ya son del tipo base Excepción y tienen la capacidad de ser “arrojadas”.
Con esto vamos a modificar un poco nuestra primera clase Aritmética y le vamos a agregar el manejo de errores de acuerdo a las reglas del negocio que interesan únicamente a ella.
La clase queda asi:
package com.ricardogeek; import com.ricardogeek.ExcepcionNumeroNegativo; import com.ricardogeek.ExcepcionDivisionPorCero; public class ExcepcionNumeroNegativo { public int suma(int x, int y) throws ExcepcionNumeroNegativo { if(x < 0 || y < 0) { throw new ExcepcionNumeroNegativo(); } return x + y; } public int multiplica(int x, int y) throws ExcepcionNumeroNegativo { if(x < 0 || y < 0) { throw new ExcepcionNumeroNegativo(); } return x * y; } public int divide(int x, int y) throws ExcepcionDivisionPorCero { if(y == 0) { throw new ExcepcionDivisionPorCero(); } return x / y; } }
Entonces para comprobar que todo funciona bien, agregamos una clase Main al proyecto que luce así:
package com.ricardogeek; import com.ricardogeek.Aritmetica; public class Main { public static void main(String args []) { final Aritmetica aritmetica = new Aritmetica(); try { aritmetica.suma(-1, -2); } catch(ExcepcionNumeroNegativo excepcionNumeroNegativo) { System.out.println(excepcionNumeroNegativo.getMessage()); } try { aritmetica.multiplica(-1, -2); } catch(ExcepcionNumeroNegativo excepcionNumeroNegativo) { System.out.println(excepcionNumeroNegativo.getMessage()); } try { aritmetica.divide(1, 0); } catch(ExcepcionDivisionPorCero excepcionDivisionPorCero) { System.out.println(excepcionDivisionPorCero.getMessage()); } } }
Compilamos corriendo el siguiente comando:
javac com/ricardogeek/Main.java
Se generan los binarios y corremos el programa:
java com/ricardogeek/Main
Si todo se logró perfectamente, obtendremos el siguiente output en la terminal:
No se permiten numeros negativos. No se permiten numeros negativos. No se permiten Dividir por cero.
Y ahí lo tienen! un manejo de errores de calidad mundial!
Si gustan descargar el código del ejercicio está disponible a través de este enlace
Y ahora… manos al código, recuerden que una aplicación con errores bien manejados es una aplicación de clase mundial.
No he encontrado a nadie que sepa explicar correctamente el flujo al crear una excepción… seguiré buscando
Que parte no entendiste?
No puedo descargar el código fuente. 🙁