Java - последние переменные могут быть инициализированы в статическом блоке инициализации?

На основе моего понимания языка Java статические переменные могут быть инициализированы в static initialization block.

Однако, когда я пытаюсь реализовать это на практике (static переменные, которые являются final также), я показал ошибку в снимке экрана ниже:

https://i.stack.imgur.com/5I0am.jpg

44
задан Dave Jarvis 24 November 2017 в 17:54
поделиться

2 ответа

Да, конечно: static final переменные могут быть инициализированы в статическом блоке но.... у вас есть неявные GOTO в этом примере (try/catch это по сути 'GOTO catch if something bad happens').

Если возникнет исключение, ваши конечные переменные не будут инициализированы.

Обратите внимание, что использование статических конструкций идет вразрез с догмой объектно-ориентированного подхода. Это может усложнить тестирование и затруднить отладку.

36
ответ дан 26 November 2019 в 22:14
поделиться

Вы можете сделать это, но вам нужно выйти из статического блока, вызвав исключение - вы можете повторно выбросить исключение, которое было перехвачено, или новое. Обычно это исключение должно быть RuntimeException . Вам действительно не следует перехватывать общее исключение , а более конкретные исключения, которые могут быть сгенерированы в вашем блоке try . Наконец, если статический инициализатор генерирует исключение, он сделает класс непригодным для использования во время этого конкретного запуска, потому что JVM попытается инициализировать ваш класс только один раз. Последующие попытки использовать этот класс приведут к другому исключению, например NoClassDefFoundError .

Итак, для работы ваш инициализатор должен читать что-то вроде этого:

static {
    try {
        ...
    } catch (Exception e) {
        e.PrintStackTrace();
        throw new InitializationFailedException("Could not init class.", e);
    }
}

Предполагая, что InitializationFailedException - это пользовательское RuntimeException , но вы можете использовать существующее.

18
ответ дан 26 November 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: