Perché Java non mi consente di assegnare un valore a una variabile finale in un blocco catch dopo aver impostato il valore nel blocco try, anche se non lo è possibile per il valore finale da scrivere in caso di eccezione.Assegnazione di un valore predefinito a una variabile finale in caso di un'eccezione in Java
Ecco un esempio che illustra il problema:
public class FooBar {
private final int foo;
private FooBar() {
try {
int x = bla();
foo = x; // In case of an exception this line is never reached
} catch (Exception ex) {
foo = 0; // But the compiler complains
// that foo might have been initialized
}
}
private int bla() { // You can use any of the lines below, neither works
// throw new RuntimeException();
return 0;
}
}
Il problema non è difficile da risolvere, ma vorrei capire perché il compilatore non accetta questo.
Grazie in anticipo per eventuali ingressi!
Bene, se si sta osservando l'eccezione generale 'potrebbe essere possibile che qualcosa si verifichi solo dopo/durante' foo = x' che genererebbe un'eccezione? Forse il compilatore sta "giocando sul sicuro"? – FromCanada
Bene, questa è la domanda. Ma dubito davvero che un incarico possa generare un'eccezione e scrivere ancora un valore nella variabile. – Alfonso
Dove dici "In caso di un'eccezione questa linea non viene mai raggiunta" Sospetto che il compilatore rifiuti di conoscere le tue intenzioni a quel livello di granularità. Quindi tutto ciò che vede è che viene assegnato due volte. Forse la ragione è che, questo permette al compilatore di ottimizzare il codice fino a foo = bla(), dato che x è in definitiva superfluo? Sto solo speculando. – greim