2010-07-14 8 views
5

Ho un setter statico che viene utilizzato per impostare tutte le istanze di MyClass:Java: Creare membro della classe static cui costruttore potrebbe generare un'eccezione

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

Tuttavia questo non compilare in quanto il costruttore setter genera un'eccezione:

public class Setter { 

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

Come posso aggirare questo?

+0

Generalmente se qualcosa genera un'eccezione controllata, non è qualcosa che si desidera memorizzare in una statica. –

risposta

17

Il ExceptionInInitializerError è stato progettato proprio per questo scopo. Ecco una citazione di pertinenza dal Javadoc collegato:

Segnala un'eccezione imprevista in un inizializzatore statico. Viene generato un ExceptionInInitializerError per indicare che si è verificata un'eccezione durante la valutazione di un inizializzatore statico o dell'inizializzatore per una variabile statica.

Avvolgere l'assegnazione in un blocco di inizializzazione statico e gestire di conseguenza.

public class MyClass { 
    protected static final Setter setter; 

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

È possibile crearlo all'interno di una funzione statica, a condizione che rilevi l'eccezione (potenzialmente) alza.

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; 
     } 
    } 
} 

v'è alcun modo per consentire l'eccezione di propagare, poiché pone un'eccezione verificata (e che è illegale durante l'inizializzazione). Ci sono un paio di modi per affrontare questo:

  • sollevare un'eccezione incontrollato: Questo provoca un java.lang.ExceptionInInitializerError per ottenere sollevato quando si cerca di caricare la classe. Può essere fonte di confusione e difficile da rintracciare e eseguire il debug. Non lo consiglio

  • Change ad una variabile non definitiva, e creare una funzione per accedervi: se non definitivo della variabile, è possibile verificare se è impostato in get, e sollevare l'eccezione controllato se non lo è. Questo permette (anzi, richiede) il codice per gestire l'eccezione nel punto in cui si chiama:


public class MyClass { 
    private static Setter setter; 

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

     return setter; 
    } 
} 
+0

cosa succede se si tratta di un errore irreversibile e dovrebbe propagarsi? – sixtyfootersdude

+0

@sixtyfootersdude: racchiuderlo in un'aspirazione deselezionata. –

Problemi correlati