2013-10-20 13 views
5

Sto utilizzando BufferedReader in una classe per leggere da un file. Sto cercando di inizializzare questo blocco di inizializzazione.Il blocco di inizializzazione può generare eccezioni?

class ReadFromFile 
{ 
    BufferedReader br; 

    { 
     br = new BufferedReader(new FileReader(new File("file.txt"))); 
    } 
} 

linea nel blocco di inizializzazione getta FileNotFoundException eccezione. Quindi, il compilatore dà errore. Non voglio circondarlo con blocco try-catch. Ho risolto il problema utilizzando il costruttore al posto di blocco di inizializzazione come:

class ReadFromFile 
{ 
    BufferedReader br; 

    public ReadFromFile() throws FileNotFoundException 
    { 
     br = new BufferedReader(new FileReader(new File("file.txt"))); 
    } 
} 

ma ancora voglia di sapere se c'è un modo per lanciare un'eccezione di blocco di inizializzazione senza ottenere errore di compilazione. Grazie :)

risposta

9

Un blocco di inizializzazione può solo generare eccezioni non controllate o controllare le eccezioni dichiarate essere lanciate da tutti i costruttori. (Questo include eccezioni che sono sottoclassi di quelle dichiarate.)

Non puoi lanciare un'eccezione controllata da un inizializzatore in una classe senza costruttori dichiarati, poiché ti verrà effettivamente fornito un costruttore senza parametri che non dichiarare che getta nulla.

Da section 11.2.3 of the JLS:

Si tratta di un errore di compilazione se un inizializzatore variabile di istanza o un'istanza di inizializzazione di una classe denominata possono lanciare una classe di eccezione verificata a meno che tale classe di eccezione o una delle sue superclassi è esplicitamente dichiarata nella clausola throws di ogni costruttore della sua classe e la classe ha almeno un costruttore dichiarato esplicitamente.

+0

+1 RuntimeExceptions o Errori non verificati. –

+6

Non capisco come è possibile leggere una domanda, scrivere una risposta e trovare la citazione importante dalla specifica e fare tutto quello nello stesso minuto in cui la domanda è stata postata ... +1 – noone

+0

@noone Jon ha avuto più pratica di la maggior parte, mai meno ...;) –

1

ma ancora voglia di sapere se c'è un modo per lanciare un'eccezione di blocco di inizializzazione senza ottenere errore di compilazione.

Sì, ma è una pessima idea. È possibile farlo

class ReadFromFile { 
    BufferedReader br; 

    { 
     try { 
      br = new BufferedReader(new FileReader(new File("file.txt"))); 
     } catch(IOException ioe) { 
      // there is a number of ways to blindly throw a checked exception. 
      Thread.currentThread().stop(ioe); // don't try this at home. 
     } 
    } 
} 

Questo tutto compila e funziona, ma è inutilmente confuso.

+0

Questa è davvero roba da "non provare a casa". +1 perché ho imparato qualcosa di nuovo :) – Batty

Problemi correlati