Excepciones

excepciones
  • En tiempo de compilación (checked exceptions): Heredan de java.lang.Exception. El compilador nos obligará a controlarlas mediante un bloque Try/Catch o un throws.
  • En tiempo de ejecución (unchecked exceptions): Heredan de java.lang.RuntimeException. Es la única Exception que no es comprobada por el compilador. Un error también se produce en tiempo de ejecución, aunque un error no es una excepción.

Excepción con un catch

int i = 2;
int j = 0;
System.out.println("antes");
try{
	System.out.println(i/j);
}catch (ArithmeticException e){
	System.out.println("en catch");
	e.printStackTrace();
}
System.out.println("despues");

Output:
antes
en el try
en el catch
java.lang.ArithmeticException
despues

Excepción con varios catch

int i = 2;
int j = 0;
System.out.println("antes");
try{
	System.out.println("en el try");
	System.out.println(i/j);
}catch (ArithmeticException e){
	System.out.println("en catch1");
	e.printStackTrace();
}catch(Exception e){
	System.out.println("en catch2");
	e.printStackTrace();
}catch(Throwable t){
	System.out.println("en catch3");
	t.printStackTrace();
}
System.out.println("despues");

Output
antes
en el try
en catch1
java.lang.ArithmeticException
despues

El único catch que se aplica es el que recoge la excepción. Después de este, el programa continua ejecutándose a partir del último Catch.

Para que el código compile, los tipos de Error más generales(Throwable) deben estar por debajo de los más particulares(ArithmeticException)

Throw

public static void main(String[] args) {
	ArrojarExcepcion arrojarExcepcion = new ArrojarExcepcion();
	try {
		arrojarExcepcion.lanzarExcepcion();
	} catch (Exception e) {
		System.out.println("excepción lanzada y procesada");
	}
	arrojarExcepcion.procesarExceptionInSitu();
}

public void lanzarExcepcion() throws Exception{
	throw new Exception();
}

public void procesarExceptionInSitu(){
	try {
		throw new Exception();
	} catch (Exception e) {
		System.out.println("excepción procesada");
	}
}

Consola:
excepción lanzada y procesada
excepción procesada

Finally

El finally se ejecuta siempre, se trate la excepción o no se trate la excepción. La única forma de evitar que se ejecute el finally es ejecutando un System.exit(), que mata la máquina virtual.

Se utiliza siempre en conjunción con un try-catch. No puede haber nada después del catch y antes del finally.

public static void main(String[] args) {
	int i = 2;
	int j = 0;
	System.out.println("antes");
	try{
		System.out.println(i/j);
	}catch (ArithmeticException e){
		System.out.println("en catch1");
		e.printStackTrace();
	}catch(Exception e){
		System.out.println("en catch2");
	}catch(Throwable t){
		System.out.println("en catch3");
	}finally{
		System.out.println("en finally");
	}
	System.out.println("despues");
}

Output:
antes
en catch1
java.lang.ArithmeticException
en finally
despues

Crear una excepción

Asistente para crear excepciones en Java

Implementar Serializable

Serializar es el proceso de convertir el objeto a bytes, para poder enviarlo a través de red, y después reconstruirlo al otra lado de la red, leerlo del fichero...

Para que un objeto sea serializable basta con que implemente la interfaz Serializable.

Notas

La clase Exception implementa la interfaz Serializable.

serialVersionUID

Es posible que cuando envío un objeto serializado a un lado y a otro de la red tenga diferentes versiones del mismo. Si sucede esto, la reconstrucción de la clase en el lado que recibe es imposible.

Para comparar las versiones de las clases utilizamos el atributoprivate static final long serialVersionUID.
Este nos indica el número de versión de la clase. Debemos ir actualizándolo con las modificaciones de la clase que vayamos haciendo.

Si las versiones de dos clases que implementan Serializable no coinciden, obtendremos una InvalidClassException al deserializar.

Ejercicio excepciones

Implementar una clase Main que llame al método getPrecioConIva() de la clase Servicios e imprima el valor que devuelve.

Implementar una clase Servicios con un método llamado getPrecioConIva() que recibirá un número y devolverá dicho número multiplicado por 1.16. Si el precio es mayor que 100 arrojará una PrecioDemasiadoAltoException que será capturada en el Main.

Implementar una clase PrecioDemasiadoAltoException y sobreescribir su método printStackTrace() para que imprima el texto "El precio es demasiado alto".

Ejercicio

Implementar una clase Persona, con los siguientes campos:
String dni
String nombre
Date fechaNacimiento

Se considerará que dos instancias de Persona son iguales si tienen el mismo dni.

Implementar una clase Servicios con los siguientes métodos:

  • getPersonaMayor: Recibe un mapa de personas personas y devuelve la persona mayor. Arroja una SinDatosException si el mapa está vacío (isEmpty()).
    Para comparar las fechas de los objetos de la clase Date:
  • El método getTime() me devuelve los milisegundos de la fecha.
  • Los métodos after() y before() me devuelven true o false dependiendo de que fecha fue anterior.
  • getPrimerNombre: Recibe un mapa igual al anterior y devuelve la persona con el primer nombre en orden alfabético. Arroja una SinDatosException si el mapa está vacío. Desde este método llamaremos al método compareTo().

Implementar una clase Main con un método public static void main que crea dos objetos y realiza entre ellos las comparaciones antes indicadas. También debe indicarnos si dichas personas son iguales.

Para convertir una fecha en un objeto de tipo Date: 
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date fecha = formatter.parse(stringFecha)

Esto es MM mayúscula, las minúsculas son para minutos

  1. ¿Qué es Java?
  2. Eclipse
  3. Resolución de problemas
  4. Clases
  5. Objetos
  6. Hola mundo
  7. Comentarios
  8. Variables
  9. Constantes
  10. Operadores
  11. Lectura de datos
  12. Ejercicios con operadores aritméticos
  13. Estructuras de control
  14. Métodos
  15. Modificador static
  16. Arrays
  17. Ejercicio – juego del ahorcado
  18. Ejercicio - tres en raya
  19. Modificadores de acceso
  20. Constructores
  21. Herencia
  22. Polimorfismo
  23. Abstracción
  24. Interfaces
  25. Clases internas
  26. Garbage Collector
  27. String performance
  28. Encapsulación
  29. Contenedores
  30. Genéricos
  31. Ejercicio alta, baja, modificación y consulta en un ArrayList
  32. Ejercicio – juego de la oca
  33. Recorrer un map
  34. Sobreescritura equals
  35. Sobreescritura hashcode
  36. Sobreescritura compareTo
  37. Excepciones
  38. Implementar Serializable
  39. Enumeraciones
  40. Hilos
icono de mandar un mail¡Contacta conmigo!
contacta conmigoPablo Monteserín

¡Hola! ¿En qué puedo ayudarte?