Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Compiler-Fehlerfinal Variable in try-catch Wert zuweisen
faetzminators Vorschlag (sehr gut übrigens) läuft darauf hinaus, den try/catch Block in eine eigene Methode auszulagern, dann klappts auch mit dem final.
Naja, einen Bug würde ich das auch nicht nennen, ... aber "intuitiv falsch" schon. Hab sogar mal kurz getestet: Es hätte mich nicht gewundert, wenn er
Java:
int j=0;
j = Integer.parseInt("0");
i = j;
erlaubt hätte, aber auch das akzeptiert er nicht. Es gilt wohl der Block, in dem etwas passiert, und geht NICHT um die Frage, WO genau die Exception ausgelöst wird oder werden könnte. Bei
Java:
int j=0;
i = j;
j = Integer.parseInt("0");
wäre es ja auch klar...
Aber was will man schon von einem Computer erwarten, der sich über
Java:
int crap() {
return 123;
return 234; // ~Error: Statement not reached....
}
public class MayHaveBeenAssigned {
// Wird im Konstruktor initialisiert.
private final int i;
// Direkt initialisieren geht auch.
private final int j = parseWithoutException("1");
public MayHaveBeenAssigned(final String intStr) {
this.i = parseWithoutException(intStr);
}
private static final int parseWithoutException(final String numberStr ) {
try {
return Integer.parseInt(numberStr);
}
catch (NumberFormatException e) {
// evtl. loggen
return 0;
}
}
}
Huh? Das geht doch sowohl in Eclipse als auch mit dem [c]javac[/c]?
Falls es wen interessiert: Ich glaube, die JVM macht es unmöglich, diesen Fall wie hier gewünscht zu übersetzen. Exception Handling ist dafür zu transparent. Ich habe mal eine Version dekompiliert, die eine Exception wirft, statt versucht, einen Default-Wert zuzuweisen (das geht ja bekanntlich nicht).
Dazu gibt es einen Exception Table mit einem Eintrag von 5 bis 13 und dem Handler ab 16.
Das heißt egal wo in 5 bis 13 eine NFE auftritt, der Exception Handler 16 wird angesprungen. Es kann also nicht unterschieden werden, ob die Instruktion 10 schon durchgeführt wurde oder nicht. Damit ist es aus JVM-Sicht möglich, dass [c]i[/c] zwei mal einen Wert zugewiesen bekommt; einmal in 10 und einmal um 17 herum wo jetzt die Exception geworfen wird.
Das einzige, was mir nicht hundertprozentig klar ist, ist, warum der Eintrag im Exception Table überhaupt bis 13 gehen muss und nicht einfach nur 7 abdeckt. Damit sollte nämlich alles klar sein. Allerdings erhalte ich obiges Resultat sowohl in Eclipse als auch mit dem [c]javac[/c] und es entspricht auch den Beispielen in der JVMS. Von daher gehe ich davon aus, dass es dafür einen Grund gibt.