Wenn Sie die Signatur von makeObject()
werfen IOException
behalten wollen, müssen Sie es auf diese Weise tun:
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;
}
}
}
Es ist nicht erlaubt eine geprüfte Ausnahme von einer Methode zu werfen, die eine (statische) Feld initialisiert oder innerhalb eines statischen Blocks. Es ist jedoch erlaubt, eine ungeprüfte (Laufzeit-) Ausnahme auszulösen. So müssen Sie Ihre IOException
fangen und es in eine (Unterklasse von) RuntimeException
wickeln.
Alternativ können Sie einfach werfen nicht IOException from
makeObject() `durch die Verpackung dort tun:
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
sind eine geprüfte Ausnahme, die von der Java Language Specification verboten ist (möglicherweise) zu sein in einem geworfenen Klasse Variableninitialisierer oder statische Initialisierer (siehe JLS §11.2.3. Exception Checking):
Es ist ein Fehler bei der Kompilierung, wenn eine Klasse Variableninitialisierer (§8.3.2) oder statische Initialisierer (§8.7) von einer benannten Klasse oder Schnittstelle werfen ac gehackte Ausnahmeklasse.
Diese Einschränkung gilt nicht für ungeprüfte (Laufzeit-) Ausnahmen.
Haben Sie versucht, statische {...} Block? – efekctive
Ja, ich bekomme einen ähnlichen Fehler. – akonsu
Sie können einen "try/catch" -Block in einen statischen Initialisierungsblock setzen und die "IOException" abfangen. Ich denke, das ist so nah wie möglich. Sie können es in diesem Fall nicht deklarieren. – khelwood