En Java debe iniciar local vars. Esto no está garantizado cuando tienes estos bloques catch, ya que se puede lanzar una excepción antes de iniciar la var local en try block y no iniciar la var en el bloque catch. Por lo tanto, es posible que la var local no se haya inicializado después del bloqueo try-catch-finally.
Cuando quita el bloque catch, la var se inicializa después de intentar o se lanza una excepción y el código después de try-block nunca se ejecuta.
Ha siguientes posibilidades para solucionar este problema:
- init var antes de intentar-bloque
- init var en Try-Catch-bloques y bloques
- init var en el bloque finally
- init var solo en try-block, pero no detecta excepciones
No se garantiza que la var local se inicialice incluso cuando var init is t Lo primero que haces en try-block.Por ejemplo, el hilo ejecutado se puede detener con Thread.stop(Throwable)
después de ingresar try-block pero antes var init. Cuando esto sucede, la var no se inicializa, pero se ejecuta catch-finally y el código después de try-catch-finally también.
He aquí un ejemplo para mostrar lo que quiero decir:
public static void main(String[] args) throws InterruptedException {
Thread thread = new MyThread();
thread.start();
Thread.sleep(100);
thread.stop(new Exception());
}
private static class MyThread extends Thread {
@Override
public void run() {
int num = -1;
try {
Thread.sleep(600); //just to hit the thread at the right point
num = 100;
System.out.println("blub");
}
catch (Exception e) {
System.out.println("catch");
}
finally {
System.out.println("finally");
}
System.out.println(num);
System.out.println("after all");
}
}
Este código imprime:
catch
finally
-1
after all
Relacionado, claro. :) –