Исключения брошенного из статического intialiser может указывать на проблему проектирования. Действительно, вы не должны пытаться загружать файлы в статику. Также статичность не должна, в общем, быть изменчивой.
Например, работа с JUnit 3.8.1 вы могли бы почти использовать его из апплета/WebStart, но это не удалось из-за того, что один статический инициализатор делал доступ к файлу. Остальная часть рассматриваемого класса была подобрана в контексте, это всего лишь эта бит статичности, которая не соответствовала контексту и сдула всю структуру.
Есть, некоторые законные случаи, когда выбрано исключение. Если это случай, когда в среде нет определенной функции, скажем, потому что это старый JDK, тогда вы можете заменить реализации, и нет ничего необычного. Если класс действительно запущен, выведите исключенное исключение, вместо того, чтобы позволить сломанному классу существовать.
В зависимости от ваших предпочтений и проблемы у вас есть два общих способа обойти это: явный статический инициализатор и статический метод. (Я, и я думаю, что большинство людей предпочитает бывшие, я считаю, Джош Блох предпочитает последнее.)
private static final Thing thing;
static {
try {
thing = new Thing();
} catch (CheckedThingException exc) {
throw new Error(exc);
}
}
Или
private static final Thing thing = newThing();
private static Thing newThing() {
try {
return new Thing();
} catch (CheckedThingException exc) {
throw new Error(exc);
}
}
Примечание: статика должна быть окончательной (и вообще неизменна). Будучи окончательным, правильное одиночное задание проверяется вашим дружественным компилятором. Определенное присваивание означает, что он может ловить обработанную обработку исключений - обернуть и выбросить, не печатать/записывать. Как ни странно, вы не можете использовать имя класса для квалификации инициализации с именем класса в статическом инициализаторе (я уверен, что для этого есть веская причина).
Инициализаторы экземпляра аналогичны, хотя вы можете сделать бросок конструктора или вы можете поместить инициализатор внутри конструктора.
Ответ akf правильный, но если вы ненавидите объявление новых методов, вы также можете использовать статические блоки для инициализации ваших статических переменных; вы можете попробовать/поймать в статических блоках. –
Чтобы другие пользователи не поняли мой последний комментарий как подтверждение подхода с использованием статического блока: я предпочитаю создавать новые методы. Я просто предложил альтернативу тем, кто этого не делает. :-) –
Извините, я забыл отметить поле как статическое. Сохраняется ли рекомендация? – kpozin