2017-01-13 1 views
0

をスローするように宣言する必要があります。報告されていない例外は、私はこのコードを持ってキャッチまたは静的初期化子で

class C { 
    private static final Object myObject = makeObject(); // * 

    private static Object makeObject() throws IOException { 
     try { 
      ... 
     } catch (IOException e) { 
      ... 
      throw e; 
     } 
    } 
} 

私はそれをコンパイルしようとすると、私はラインで例外を取得*が付い:

error: unreported exception IOException; must be caught or declared to be thrown 

この場合、例外をスローする方法を宣言するにはどうすればよいですか?私はそれをキャッチすることができます知っている、私の質問は構文についてです。

+0

static {...}ブロックを試しましたか? – efekctive

+0

はい、同様のエラーが発生します。 – akonsu

+0

静的な初期化ブロック内に 'try/catch'ブロックを置き、' IOException'をキャッチすることができます。私はそれがあなたが得ることができるほど近いと思う。この場合、それをスローすることはできません。 – khelwood

答えて

5

あなたがIOExceptionを投げmakeObject()の署名を維持したい場合、あなたはそれをこのように行う必要があります。(静的)フィールドを初期化したりする方法からチェック例外をスローすることはできません

class C { 
    private static final Object myObject; 

    static { 
     try { 
      myObject = makeObject(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private static Object makeObject() throws IOException { 
     try { 
      ... 
     } catch (IOException e) { 
      ... 
      throw e; 
     } 
    } 
} 

を静的ブロック内。しかし、チェックされていない(実行時の)例外をスローすることは許されています。だからあなたはIOExceptionをキャッチし、RuntimeExceptionの(サブクラス)に包む必要があります。

また、あなたはただそこにラッピングを行うことによってIOException from makeObjectを() `をスローすることはできません。

class C { 
    private static final Object myObject = makeObject(); // OK now 

    private static Object makeObject() { // no 'throws' 
     try { 
      ... 
     } catch (IOException e) { 
      ... 
      throw new RuntimeException(e); // wrap here 
     } 
    } 
} 

IOExceptionは(潜在的に)AにスローされるJava言語仕様で禁止されている確認済みの例外ですクラス変数初期化子またはstatic初期化子(JLS §11.2.3. Exception Checkingを参照してください):

という名前のクラスまたはインタフェースのクラス変数初期化子(§8.3.2)または静的初期化子(§8.7)が投げることができればそれはコンパイル時のエラーです交流ヘックドされた例外クラス。

この制限は、チェックされていない(実行時の)例外には適用されません。

+0

'RuntimeException'をスローするのはなぜうまくいくのですが、' IOException'を投げるのはなぜですか?私はJavaを初めて使っています。 – akonsu

+0

@akonsu - これはルールとして指定されているJLSへの参照を追加しました。違いをよりよく理解するには、チェックされている例外とチェックされていない例外を読んでみてください。 –

+0

静的メンバーは、そのクラスのインスタンスが作成される前に初期化されます。静的初期化中に保護されていない例外があると、そのクラスを使用できなくする可能性があります – efekctive

関連する問題