2013-10-20 8 views
5

クラスからBufferedReaderを使用してファイルから読み込みます。私はイニシャライザブロックでこれを初期化しようとしています。イニシャライザブロックが例外をスローできますか?

class ReadFromFile 
{ 
    BufferedReader br; 

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

イニシャライザブロック内の行は、FileNotFoundException例外をスローします。コンパイラはエラーを出します。私はtry-catchブロックで囲む必要はありません。私は次のように代わりに初期化子ブロックのコンストラクタを使用して問題を解決:

class ReadFromFile 
{ 
    BufferedReader br; 

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

しかし、まだコンパイルエラーを取得せずに初期化子ブロックの外に例外をスローするためにどのような方法があるかどうかを知りたいです。ありがとう:)

答えて

9

イニシャライザブロックは、チェックされていない例外、またはすべてのコンストラクタによってスローされると宣言されたチェック例外をスローするだけです。

宣言されたコンストラクタを持たないクラスの初期化子からチェック例外をスローすることはできません。これは、パラメータなしのコンストラクタであるを効果的に提供するためです(この例外は、宣言された例外のサブクラスです)。は何も投げないと宣言していません。 section 11.2.3 of the JLSから

その例外クラスまたはそのスーパーの一つが明示的に宣言されていない限り、名前のクラスのインスタンス変数の初期化子やインスタンス初期化子がチェック例外クラスを投げることができればそれはコンパイル時のエラーですそのクラスの各コンストラクタのthrows節にあり、クラスには少なくとも1つの明示的に宣言されたコンストラクタがあります。

+0

+1 RuntimeExceptionsまたはErrorsはチェックされていないためです。 –

+6

質問を読んで回答を書いて、仕様書から重要な見積もりを見つけて、質問が投稿された同じ分にすべてを行うことはできません。+1 – noone

+0

@noone Jonはほとんどの、決して少ない... ...) –

1

しかし、まだコンパイルエラーを取得せずに初期化子ブロックの外に例外をスローするためにどのような方法があるかどうかを知りたいです。

はい、ありますが、非常に悪い考えです。これを行うことができます

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

これはすべてコンパイルされ、動作しますが、不必要に混乱します。

+0

これは本当に "家でこれを試してはいけない"ものです。 +1何か新しいことを学んだので:) – Batty

関連する問題