Para evitar estos problemas esta la interfaz UncaughtExceptionHandler, la cual nos permite implementarla e implementar su método uncaughtException, en el cual podemos realizar la lógica pertienente en caso de error no controlado. Se ve más claro en un ejemplo sencillo.
Por un lado tenemos el hilo, el cual puede que en determinadas ocasiones lance un tipo de excepción no controlada.
public class PruebaThread extends Thread { private int numHilo; public PruebaThread(int numero){ super(); numHilo = numero; } public void run() { Random rand = new Random(); int randomNum = rand.nextInt(3); System.out.println("NumHilo: "+numHilo+" tiene randomNum: "+randomNum); if (randomNum == 0) { throw new NullPointerException(); } else if (randomNum == 1) { throw new ArithmeticException(); } else if (randomNum == 2) { throw new IllegalArgumentException(); } } }
Por otro lado implementamos la interfaz y controlamos estas posibles excepciones, para cada una de ellas es posible que queramos realizar un tratamiento distinto.
import java.lang.Thread.UncaughtExceptionHandler; public class PruebaUncaughtExceptionHandler implements UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { if(e instanceof NullPointerException){ System.out.println("Es NullPointerException"); }else if(e instanceof ArithmeticException){ System.out.println("Es ArithmeticException"); }else if(e instanceof IllegalArgumentException){ System.out.println("Es IllegalArgumentException"); } } }
Si ejecutamos el siguiente código podemos ver como es el funcionamiento de los hilos y su tratamiento de excepciones
public static void main(String[] args) { for (int i = 0; i < 8; i++) { PruebaThread thread = new PruebaThread(i); thread.setUncaughtExceptionHandler(new PruebaUncaughtExceptionHandler()); thread.start(); } }
Resultado:
NumHilo: 3 tiene randomNum: 1
Es ArithmeticException
NumHilo: 2 tiene randomNum: 1
Es ArithmeticException
NumHilo: 5 tiene randomNum: 1
Es ArithmeticException
NumHilo: 1 tiene randomNum: 2
Es IllegalArgumentException
NumHilo: 0 tiene randomNum: 2
Es IllegalArgumentException
NumHilo: 4 tiene randomNum: 0
Es NullPointerException
NumHilo: 6 tiene randomNum: 0
Es NullPointerException
NumHilo: 7 tiene randomNum: 1
Es ArithmeticException
No hay comentarios:
Publicar un comentario