Výjimka vyvolá ze statického intialiser může znamenat problém návrhu. Opravdu byste neměli pokoušet o načtení souborů do statiky. Také statický by neměly obecně být proměnlivé.
Například práci zpět s JUnit 3.8.1 můžete použít téměř ze applet / WEBSTART, ale to se nepodařilo kvůli jedné statické initialiser dělá přístup k souborům. Zbytek třídy zapojené byl vybaven kontextovou pokutu, je to právě tento kousek statické elektřiny, které se nevešly kontext a foukal celý rámec pryč.
Existují některé legitimní případy, kdy je vyvolána výjimka. Jestli je to pravda, že prostředí nemá konkrétní funkci, řekněme, protože je to starý JDK, pak budete chtít nahradit implementace, a není nic neobvyklého. Jestli je opravdu borked třída, házet nekontrolovanou výjimku, spíše než aby zlomený třída existovat.
V závislosti na vašich preferencí a problém po ruce, je tu dva běžné způsoby, jak jít kolem něj: explicitní statické initialiser a statické metody. (I, a myslím, že většina lidí, preferují bývalý;. Domnívám se, Josh Bloch preferuje druhá)
private static final Thing thing;
static {
try {
thing = new Thing();
} catch (CheckedThingException exc) {
throw new Error(exc);
}
}
Nebo
private static final Thing thing = newThing();
private static Thing newThing() {
try {
return new Thing();
} catch (CheckedThingException exc) {
throw new Error(exc);
}
}
Poznámka: statika by měla být konečná (a obecně neměnné). Být konečný, správný jediný úkol je zkontrolovat svým přátelským kompilátoru. Určitý úkol znamená, že může zachytit zlomené zpracování výjimek - zabalit a vyhodit, netisknou / log. Kupodivu, nelze uživatelské jméno třídy kvalifikovat inicializace s názvem třídy ve statickém initialiser (Jsem si jistý, že je to dobrý důvod pro to).
Instance initialisers jsou podobné, i když si můžete udělat konstruktoru hod nebo si můžete dát initialiser uvnitř konstruktoru.