2013-08-07 33 views
7

ich einen Code mit dieser Struktur haben:Die lokale Variable möglicherweise nicht initialisiert worden sind - innerhalb einer Methode ungeprüfte Ausnahme throw Detect

public void method() { 
    Object o; 
    try { 
     o = new Object(); 
    } catch (Exception e) { 
     //Processing, several lines 
     throw new Error(); //Our own unchecked exception 
    } 
    doSomething(o); 
} 

ich schon einige Methoden haben, in dem ich den gleichen Code in der Fang haben Block, also möchte ich es zu einer Methode extrahieren, damit ich einige Zeilen speichern kann. Mein Problem ist, dass, wenn ich das tue, ich einen Compiler-Fehler bekomme " Die lokale Variable o wurde möglicherweise nicht initialisiert".

public void method() { 
    Object o; 
    try { 
     o = new Object(); 
    } catch (Exception e) { 
     handleError(); 
    } 
    //doSomething(o); compiler error 
} 


private void handleError() throws Error { 
    //Processing, several lines 
    throw new Error(); 
} 

Gibt es eine Problemumgehung?

+0

Hinweis initialisieren sollten: Instanzvariable zu initialisieren nicht brauchen, aber der lokalen Variable (Variable in einer Methode) müssen initialisiert werden – gjman2

Antwort

5

Sie müssen lokale Variablen initialisieren, bevor sie wie unten

public void method() { 
    Object o=null; 
    try { 
     o = new Object(); 
    } catch (Exception e) { 
     handleError(); 
    } 
    doSomething(o); 
} 
verwendet werden

Sie werden nicht die Kompilierung Ausfall erhalten, bis Sie lokale Variable verwenden, die nicht

+1

Nicht wirklich geeignet, wenn die Variable aus irgendeinem Grund endgültig sein muss. In diesem Fall würde ich die Lösung von @ gyro-gearless bevorzugen. – Eusebius

3

Da o wird immer innerhalb des try Block initialisiert und o Initialisierung könnte eine Ausnahme auslösen, java denkt, dass doSomething(o) Aussage erreichen könnten, ohne o initialisiert. So will Java o initialisiert werden, incase new Object() wirft Ausnahme.

Initialisierung So o mit null wird das Problem

public void method() { 
    Object o = null; 
    try { 
     o = new Object(); //--> If new Object() throws exception then o remains uninitialized 
    } catch (Exception e) { 
     handleError(); 
    } 
    if(o != null) 
     doSomething(o); 
} 
+0

Ich würde betrachten Dies ist ein Anti-Pattern, da es den Code mit unnötigen Wenn-nicht-Null-Checks überfüllt! Der try/catch-Mechanismus dient dazu, ein solches Muster zu vermeiden: Wenn die Erstellung einiger erforderlicher Objekte fehlschlägt, sollte die Funktion durch eine Ausnahme verlassen werden. –

+0

Stimmt, ich stimme zu. Meine Absicht war, die Lösung zu geben und zu erklären, warum wir Fehler bekommen – sanbhat

3

initialisieren Ihr Objekt beheben: Object o = null;, aber achten Sie auf die NullPointerException s, die ausgelöst werden können, wenn Sie es auf die Methodenaufrufe geben.

2

einfach die doSomething(o) innerhalb der try { } setzen initialisiert wurde Block:

Sie möchten vielleicht DoSomething() nicht ausführen, wenn die Erstellung Ihres Objekts fehlschlägt!

0

Instanz Variable der Objekttyp ist, so dass Sie Wert „null“

public void method() { 
Object o=null; 
try { 
    o = new Object(); 
} catch (Exception e) { 
    handleError(); 
} 
doSomething(o); 
} 
Verwandte Themen