ExceptionInInitializerError
An ExceptionInInitializerError выбрасывается, чтобы указать, что произошло исключение во время оценки статического инициализатора или инициализатора для статической переменной.
ExceptionInInitializerError выбрасывается, когда JVM пытается загрузить новый класс.Во время процедуры загрузки класса оцениваются все статические переменные и статические инициализаторы.Статический инициализатор - это блок, заключенный в фигурные скобки, без имени и типа возвращаемого значения, за исключением ключевого слова static
.
Пример статического инициализатора:
import java.util.UUID;
class Example {
private static String ID = null;
static {
ID = UUID.randomUUID().toString();
}
}
Статический инициализатор оценивается только один раз во время процедуры загрузки класса.Таким образом, выброшенное исключение в оценке статической переменной или инициализатора помещается в ExceptionInInitializerError
, чтобы JVM могла указать, что класс не может быть инициализирован и загружен.
Пример, который выбрасывает *Ошибка 1020 * выглядит следующим образом:
public class Example {
private static String message = null;
private static String subMessage = null;
public Example(String message) {
Example.message = message;
}
static {
/* Store the first 10 characters of the input message. */
subMessage = message.substring(0, 10);
}
public String getSubMessage() {
return subMessage;
}
public static void main(String[] args) {
Example exampleClass = new Example("Test");
System.out.println(exampleClass.getSubMessage());
}
}
При выполнении приведенного выше фрагмента кода вы увидите следующую ошибку:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at main.java.Example.<clinit>(Example.java:13)
Вы можете использовать любой из следующих методов для получения дополнительной информации олежащее в основе фактическое исключение:
getException()
: возвращает исключение, которое произошло во время статической инициализации, вызвавшей создание этой ошибки. getCause()
: возвращает исключение, вызвавшееэта ошибка будет выдана.
Работа с ExceptionInInitializerError
ExceptionInInitializerError
используется в качестве оболочки, чтобы указать, что исключение возникает в блоке статического инициализатора или оценкезначения статической переменной.Таким образом, мы должны убедиться, что исходное исключение исправлено, чтобы JVM могла успешно загрузить наш класс.
Outro
Вы можете выбросить unchecked
/runtime
исключения из блока статического инициализатора.Однако вы не можете позволить, чтобы проверенное исключение распространялось из статического блока, потому что невозможно обработать эти исключения в вашем источнике.