Compiler-Fehler final Variable in try-catch Wert zuweisen

xehpuk

Top Contributor
Moin!

Ich wage mich mal wieder ins Anfängerforum. :oops:

Folgender Code:
Java:
public class MayHaveBeenAssigned {
	private final int i;
	
	{
		try {
			i = Integer.parseInt("0");
		} catch (NumberFormatException e) {
			i = 0;
		}
	}
}
Compilerfehler in Zeile 8: "The final field i may already have been assigned"

In welchem Fall denn? Dasselbe übrigens auch bei checked exceptions.

Und wie soll man es denn sonst machen?
 

xehpuk

Top Contributor
Ohne final wärs ja ein blöder Würgaround.

Kann man das als Bug ansehen? Würde das dann gern Oracle zukommen lassen.

Den Vorschlag mit der eigenen Methode verstehe ich nicht. Wie meinst du das?
 
M

maki

Gast
Kein Bug, kannst aber mal an Oracle schreiben *g*

faetzminators Vorschlag (sehr gut übrigens) läuft darauf hinaus, den try/catch Block in eine eigene Methode auszulagern, dann klappts auch mit dem final.
 

Marco13

Top Contributor
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....
}
beschwert, aber
Java:
int crap() {
    if (true) return 123;
    return 234;
}
durchgehen läßt :D
 
N

nillehammer

Gast
Den Vorschlag mit der eigenen Methode verstehe ich nicht. Wie meinst du das?
Java:
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;
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
Ah, danke. Jetzt leuchtets mir ein. Finde den Compiler weiterhin doof, aber das Problem an sich ist gelöst. Erledigt! :)
 

musiKk

Top Contributor
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.

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).

Code:
 0 aload_0
 1 invokespecial #1 <java/lang/Object.<init>>
 4 aload_0
 5 ldc #2 <0>
 7 invokestatic #3 <java/lang/Integer.parseInt>
10 putfield #4 <Test.i>
13 goto 26 (+13)
16 astore_1
17 new #6 <java/lang/RuntimeException>
20 dup
21 aload_1
22 invokespecial #7 <java/lang/RuntimeException.<init>>
25 athrow
26 return

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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
F Methoden Cannot refer to a non-final variable.. verständnisproblem. Java Basics - Anfänger-Themen 7
R Variablen final String Variable als Attribut veränderbar? Java Basics - Anfänger-Themen 21
N local variable model is accessed from within inner class; needs to be declared final Java Basics - Anfänger-Themen 4
C Error: The final local variable variable cannot be assigned, since it is defined in an enclosing typ Java Basics - Anfänger-Themen 4
C final variable Java Basics - Anfänger-Themen 4
P Can not refer to a non final variable... Java Basics - Anfänger-Themen 3
T Warum muss diese Variable final deklariert werden? Java Basics - Anfänger-Themen 5
M Cannot refer to a non-final variable Java Basics - Anfänger-Themen 10
C Setter-Methode mit final-Attribut Java Basics - Anfänger-Themen 9
J final attribute erben Java Basics - Anfänger-Themen 2
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
A final String verrechnen Java Basics - Anfänger-Themen 2
A Variablen zum final verändern Java Basics - Anfänger-Themen 4
D Interface Final für Parameter in überschriebenen Methoden? Java Basics - Anfänger-Themen 3
E Sinn: final in Parameterliste verwenden Java Basics - Anfänger-Themen 2
M Iterator cannot refer to a non final... Java Basics - Anfänger-Themen 20
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
D Kapselung final Variablen mit Getter? Java Basics - Anfänger-Themen 2
R JTextArea final Status ändern Java Basics - Anfänger-Themen 11
F Static final Klasse Java Basics - Anfänger-Themen 0
S Kopierkonstrukter eines Objekts mit final Attributen Java Basics - Anfänger-Themen 6
T Schlüsselworte final Java Basics - Anfänger-Themen 1
M Wann final verwenden? Java Basics - Anfänger-Themen 5
C Klassen Minesweeper Problem. int needs to be final (inner class problem) Java Basics - Anfänger-Themen 3
U final Instanz Java Basics - Anfänger-Themen 11
W run Methode in Time erzwingt final Java Basics - Anfänger-Themen 3
D Polymorphie final class Java Basics - Anfänger-Themen 2
C Erste Schritte felder, die public final sind Java Basics - Anfänger-Themen 6
H static final vs. final static Java Basics - Anfänger-Themen 3
A final und extends Java Basics - Anfänger-Themen 14
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
J final variablen Java Basics - Anfänger-Themen 3
P Variablen static final boolean Java Basics - Anfänger-Themen 9
S Interface Final und interface Java Basics - Anfänger-Themen 6
ruutaiokwu final wenn immer möglich verwenden? Java Basics - Anfänger-Themen 30
T Verständnis von "final" und "static" Java Basics - Anfänger-Themen 6
T In methode Final Objekte übergeben? Java Basics - Anfänger-Themen 9
G Poi 3.5-Final zum laufen bringen Java Basics - Anfänger-Themen 2
H final/static Vererbung Java Basics - Anfänger-Themen 4
H Variablen final? Java Basics - Anfänger-Themen 3
G final Variablen in enhanched-for Java Basics - Anfänger-Themen 2
V Frage zu final und Class bzw. Class.cast Java Basics - Anfänger-Themen 5
G static final Java Basics - Anfänger-Themen 7
Q Vector verändert trotz final seine Größe Java Basics - Anfänger-Themen 5
A final Variablen und der GarbageCollector Java Basics - Anfänger-Themen 2
G OOP - final Java Basics - Anfänger-Themen 2
B objekt wann als final deklarieren? Java Basics - Anfänger-Themen 2
G Sollte man Klassenvariablen als final deklarieren? Java Basics - Anfänger-Themen 3
J Interface: The final field Variablen.N cannot be assigned Java Basics - Anfänger-Themen 2
B privat mit und ohne final Java Basics - Anfänger-Themen 4
B final vor Funktionsparameter? Java Basics - Anfänger-Themen 21
D Static, final Objekte mit Exceptions im Konstruktor Java Basics - Anfänger-Themen 2
W Fehlermeldung "...needs to be declared final" ! Java Basics - Anfänger-Themen 4
N Wieso final ? Java Basics - Anfänger-Themen 4
G <identifier> expected bei public void final Java Basics - Anfänger-Themen 3
A Problem mit innerer Klasse/final Java Basics - Anfänger-Themen 2
G Methoden + variablen als final definieren? Java Basics - Anfänger-Themen 3
F enum oder static final boolean? Java Basics - Anfänger-Themen 18
M enum final Methoden Java Basics - Anfänger-Themen 24
S final String Java Basics - Anfänger-Themen 2
N The serializable class.does not declare a static final . Java Basics - Anfänger-Themen 2
T private final String oder final String? Was ist richtig? Java Basics - Anfänger-Themen 4
F public final void getsignature() | anfänger Java Basics - Anfänger-Themen 7
A class does not declare a static final serialVersionUID Java Basics - Anfänger-Themen 13
G wieso muss Textfield final sein? Java Basics - Anfänger-Themen 6
A array nach initialisierung final machen? Java Basics - Anfänger-Themen 17
G public static void main(final String[] args) Java Basics - Anfänger-Themen 4
G Warum muss das Textfeld final sein? Java Basics - Anfänger-Themen 2
P final mit Parametern Java Basics - Anfänger-Themen 3
O Variable Zimmergrößen per scanner einlesen Java Basics - Anfänger-Themen 5
richis-fragen String("AT") als StringObject-Variable deklarieren Java Basics - Anfänger-Themen 14
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
E Variable von 1. Fenster an 2. Fenster übergeben. Java Basics - Anfänger-Themen 7
T Variable in Schleife deklarieren, Speicherplatz, Garbage Collector Java Basics - Anfänger-Themen 10
T Datum als Variable wert Java Basics - Anfänger-Themen 4
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
U Wie mache ich die Variable xyz eindeutig/unique? Java Basics - Anfänger-Themen 20
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Variable Felderanzahl Java Java Basics - Anfänger-Themen 10
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
W Schleife und einmal variable++ zu viel Java Basics - Anfänger-Themen 20
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
G variable kopieren bzw. woanders benutzen Java Basics - Anfänger-Themen 6
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben