In Java è necessario avviare le vars locali. Questo non è garantito quando si hanno questi blocchi catch dal momento che può essere lanciata un'eccezione prima di avviare la var locale nel blocco try e non si inizia la var nel blocco catch. Pertanto la var locale potrebbe non essere stata inizializzata dopo il blocco try-catch-finally.
Quando si rimuove il blocco catch, la variabile viene inizializzata dopo la prova o viene generata un'eccezione e il codice dopo try-block non viene mai eseguito.
Hai seguito le possibilità per risolvere questo problema:
- init var prima di try-block
- init var nel try-catch-blocchi e blocchi
- init var nel blocco finally
- init var solo in try-block, ma non rilevare eccezioni
La variabile locale non può essere inizializzata anche se var init is t la prima cosa che fai in try-block.Ad esempio, il thread eseguito può essere interrotto con Thread.stop(Throwable)
dopo aver inserito try-block ma prima di var init. Quando ciò accade, var non viene inizializzato ma catch-finally viene eseguito e anche il codice dopo try-catch-finally.
Ecco un esempio per mostrare cosa intendo:
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");
}
}
Questo codice stampa out:
catch
finally
-1
after all
fonte
2012-01-05 10:30:24
Correlato, certo. :) –