あなたが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)が投げることができればそれはコンパイル時のエラーです交流ヘックドされた例外クラス。
この制限は、チェックされていない(実行時の)例外には適用されません。
static {...}ブロックを試しましたか? – efekctive
はい、同様のエラーが発生します。 – akonsu
静的な初期化ブロック内に 'try/catch'ブロックを置き、' IOException'をキャッチすることができます。私はそれがあなたが得ることができるほど近いと思う。この場合、それをスローすることはできません。 – khelwood