2010-07-14 3 views
5

ich eine statische Setter haben, die alle Instanzen von MyClass wird eingestellt:Java: Erstellen Sie statische Klasse Element, dessen Konstruktor könnte eine Ausnahme auslösen

public class MyClass { 
     .... 
    protected static final Setter setter = new Setter(); 
     ... 
} 

jedoch diese nicht kompiliert, da die Setter-Konstruktor eine Ausnahme auslöst:

public class Setter { 

    public Setter() throws FileNotFoundException { 
      .... 
    } 
} 

Wie kann ich das umgehen?

+0

Im Allgemeinen, wenn etwas eine geprüfte Ausnahme auslöst, ist es nicht etwas, das Sie in einer statischen speichern möchten. –

Antwort

17

Die ExceptionInInitializerError ist für genau diesen Zweck. Hier ein Hinweis auf die Relevanz des verknüpften Javadoc:

Zeigt an, dass eine unerwartete Ausnahme in einem statischen Initialisierer aufgetreten ist. Ein ExceptionInInitializerError wird ausgelöst, um anzuzeigen, dass während der Evaluierung eines statischen Initialisierers oder des Initialisierers für eine statische Variable eine Ausnahmebedingung aufgetreten ist.

Die Zuweisung in einen statischen Initialisierungsblock einbinden und entsprechend behandeln.

public class MyClass { 
    protected static final Setter setter; 

    static { 
     try { 
      setter = new Setter(); 
     } catch (FileNotFoundException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
    } 
} 
2

Sie können es innerhalb einer statischen Funktion erstellen, solange Sie die Exception abfangen, die (potenziell) ausgelöst wird.

public class MyClass { 
    protected static final Setter setter = createSetter(); 

    protected static Setter createSetter() { 
     try { 
      return new Setter(); 
     } catch(FileNotFoundException e) { 
      // handle it appropriately 
      return null; 
     } 
    } 
} 

Es gibt keine Möglichkeit, die Ausnahme zu erlauben, zu verbreiten, da es wirft eine geprüfte Ausnahme (und das ist illegal während der Initialisierung). Es gibt ein paar Möglichkeiten, das zu lösen ist:

  • Raise eine ungeprüfte Ausnahme: Dies bewirkt, dass ein java.lang.ExceptionInInitializerError angehoben werden, wenn die Klasse zu laden versucht. Es kann verwirrend und schwer zu verfolgen und zu debuggen sein. Ich empfehle es nicht.

  • es Wechsel zu einem nicht-final-Variable, und erstellen Sie eine Funktion es zuzugreifen: Wenn das nicht-Finale Variable, können Sie überprüfen, ob es in der get-Set, und die geprüfte Ausnahme auslösen, wenn es nicht. Auf diese Weise kann (in der Tat erfordert) Ihren Code die Ausnahme an dem Punkt zu behandeln, wo es heißt:


public class MyClass { 
    private static Setter setter; 

    protected static synchronized Setter getSetter() raises FileNotFoundException { 
     if setter == null { 
      setter = new Setter(); 
     } 

     return setter; 
    } 
} 
+0

Was ist, wenn es sich um einen schwerwiegenden Fehler handelt und es sich ausbreiten sollte? – sixtyfootersdude

+0

@ Sixtyfootersdude: wickeln Sie es in eine ungeprüfte Exception. –

Verwandte Themen