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:
intcrap(){return123;return234;// ~Error: Statement not reached....}
publicclassMayHaveBeenAssigned{// Wird im Konstruktor initialisiert.privatefinalint i;// Direkt initialisieren geht auch.privatefinalint j =parseWithoutException("1");publicMayHaveBeenAssigned(finalString intStr){this.i =parseWithoutException(intStr);}privatestaticfinalintparseWithoutException(finalString numberStr ){try{returnInteger.parseInt(numberStr);}catch(NumberFormatException e){// evtl. loggenreturn0;}}}
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.