Exception InInitializer Error Class
Definition
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Signals that an unexpected exception has occurred in a static initializer.
Remarks
Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
Constructors
Constructs an ExceptionInInitializerError with null as its detail message string and with no saved throwable object.
A constructor used when creating managed representations of JNI objects; called by the runtime.
Constructs an ExceptionInInitializerError with null as its detail message string and with no saved throwable object.
Constructs an ExceptionInInitializerError with null as its detail message string and with no saved throwable object.
Fields
Properties
Returns the cause of this throwable or null if the cause is nonexistent or unknown.
(Inherited from Throwable)
Returns the exception that occurred during a static initialization that caused this error to be created.
The handle to the underlying Android instance.
(Inherited from Throwable)
Creates a localized description of this throwable.
Returns the detail message string of this throwable.
(Inherited from Throwable)
This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.
This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.
Methods
Appends the specified exception to the exceptions that were suppressed in order to deliver this exception.
(Inherited from Throwable)
Fills in the execution stack trace.
Initializes the cause of this throwable to the specified value.
Prints this throwable and its backtrace to the standard error stream.
Prints this throwable and its backtrace to the standard error stream.
Prints this throwable and its backtrace to the standard error stream.
Sets the Handle property.
Sets the stack trace elements that will be returned by #getStackTrace() and printed by #printStackTrace() and related methods.
(Inherited from Throwable)
Explicit Interface Implementations
| IJavaPeerable.Disposed() | (Inherited from Throwable) |
| IJavaPeerable.DisposeUnlessReferenced() | (Inherited from Throwable) |
| IJavaPeerable.Finalized() | (Inherited from Throwable) |
| IJavaPeerable.JniManagedPeerState | (Inherited from Throwable) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) | (Inherited from Throwable) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) | (Inherited from Throwable) |
| IJavaPeerable.SetPeerReference(JniObjectReference) | (Inherited from Throwable) |
Extension Methods
Performs an Android runtime-checked type conversion.
Когда Java выбрасывает ошибку ExceptionInInitializerError?
Узнайте, что заставляет Java выдавать ExceptionInInitializerError, используя несколько практических примеров
1. Обзор
В этом кратком руководстве мы увидим, что заставляет Java выбрасывать экземпляр ExceptionInInitializerError исключение.
Начнем с небольшой теории. Затем мы увидим несколько примеров этого исключения на практике.
2. Ошибка exceptioninitializererror
Теперь, когда мы знаем причину этого исключения, давайте рассмотрим его на практике.
3. Блок Статического Инициализатора
Чтобы иметь неудачный инициализатор статического блока, мы намеренно разделим целое число на ноль:
Теперь, если мы инициализируем инициализацию класса с помощью чего-то вроде:
Тогда мы увидим следующее исключение:
Также стоит упомянуть, что метод является методом инициализации класса в JVM.
4. Инициализация статической Переменной
То же самое происходит, если Java не инициализирует статическую переменную:
Опять же, если мы запустим процесс инициализации класса:
Затем происходит то же самое исключение:
Аналогично статическим блокам инициализатора, первопричина исключения также сохраняется:
5. Проверенные исключения
В рамках спецификации языка Java (JLS-11.2.3) мы не можем выбрасывать проверенные исключения внутри блока статического инициализатора или инициализатора статической переменной. Например, если мы попытаемся сделать это:
Компилятор потерпит неудачу со следующей ошибкой компиляции:
В качестве соглашения мы должны обернуть возможные проверенные исключения внутри экземпляра Исключение ininitializererror когда наша статическая логика инициализации выдает проверенное исключение:
Как показано выше, метод getDeclaredConstructor() вызывает проверенное исключение. Поэтому мы поймали проверенное исключение и завернули его, как предполагает конвенция.
Поскольку мы уже возвращаем экземпляр Исключение ininitializererror исключение явно, Java не будет заключать это исключение в еще одно Исключение ininitializererror пример.
Однако, если мы создадим любое другое непроверенное исключение, Java выдаст другое ExceptionInInitializerError :
Здесь мы заключаем проверенное исключение в непроверенное. Поскольку это непроверенное исключение не является экземпляром ExceptionInInitializerError, Java снова обернет его, что приведет к этой неожиданной трассировке стека:
Как показано выше, если мы будем следовать соглашению, то трассировка стека будет намного чище, чем это.
5.1. OpenJDK
В последнее время это соглашение даже используется в самом исходном коде OpenJDK. Например, вот как AtomicReference использует этот подход:
6. Заключение
В этом уроке мы увидели, что заставляет Java выбрасывать экземпляр ExceptionInInitializerError exception.
ExceptionInInitializerError при запуске JavaFX приложения из другого класса
При создании экземпляра класса App в main класса Main в коде ниже возникает следующая ошибка:
До этого читал аналогичный вопрос на иноязычном StackOverflow, но приведенные там методы решения не помогли.
1 ответ 1
ExceptionInInitializerError это ошибка, которая возникает когда во время статической инициализации класса выбрасывается исключение.
Например, если в классе есть такое поле:
Пути исправления.
Для исправления ошибки нужно найти оригинальное исключение. Возможные варианты:
Избавиться от статической инициализации. Если поля не используются в нескольких разных объектах, то их не нужно делать статическими. Попробуйте убрать static из объявления поля и использующих его методов и посмотрите что получится.
Ошибки, возникшие при инициализации полей класса уже не будут оборачиваться в Error и Вы сможете увидеть оригинальное исключение.
В Вашем случае это, скорее всего, java.lang.IllegalStateException: Toolkit not initialized по причине того, что элементы создаются до инициализации платформы. Посмотрите аналогичный вопрос на английском: JavaFX issue with static keyword; with Minimal, Complete, and Verifiable example
Просмотреть до конца трассировку стека по ошибке. Метод getCause() возвращает оригинальное исключение и обычно это исключение включается в вывод по ошибке. Для примера выше выводится:
Обрабатывать ошибки при инициализации. Перенести инициализацию переменных в методы, либо блоки и обрабатывать ошибки самому.
После того как найдете оригинальное исключение его нужно будет как-то обрабатывать и/или устранять. Но это уже совсем другая история.
Русские Блоги
ExceptionInInitializerError в Java и ее решение
Стандарты Unicorn Enterprise Recruitment Python для инженеров 2019 года >>>
Когда исключение происходит в статическом блоке инициализации, JVM бросает java.lang.ExceptionInInitializerError. Если вы понимаете статические переменные в Java, вы будете знать, что они инициализируются при загрузке класса. Если во время инициализации этой статической переменной происходит исключение, будет выдано java.lang.ExceptionInInitializerError. Это может быть вызвано любым исключением, таким как java.lang.ArrayIndexOutOfBound или java.lang.NullPointerException. Разработчики Java обычно смущены этой ошибкой: он чувствует, что не определяет какой-либо статический блок инициализации, почему он выдает исключение ExceptionInInitializerError, фактически Java по умолчанию инициализирует статические переменные в блок статической инициализации по умолчанию. И затем инициализируйте их в том порядке, в котором они были объявлены в исходном файле. Например, переменная ABC объявляется в первой строке, используется во второй строке и инициализируется только в третьей строке, а затем код во второй строке вызывает исключение NullPointerException, которое будет инкапсулировано в ExceptionInInitializerError. Если этот код выполняется в главном потоке, вы увидите это сообщение об ошибке в консоли или файле журнала: «Исключение в потоке» main «java.lang.ExceptionInInitializerError». В большой системе с большим количеством файлов журналов такие ошибки легко можно игнорировать, и программист получит исключение java.lang.NoClassDefFoundError. К сожалению, эта ошибка возникает только тогда, когда кто-то другой использует этот класс, потому что ExceptionInInitializerError вызвал сбой загрузки этого класса. Поскольку загрузка класса не удалась, JVM сгенерирует NoClassDefFoundError. Иногда это вводит в заблуждение разработчиков Java, они проверяют classpath, PATH и java.library.path, чтобы увидеть, отсутствует ли этот класс, но они не могут найти никаких проблем, что приводит их в замешательство. Если вы анализируете причину NoClassDefFoundError, вам лучше проверить, есть ли ExceptionInInitializerError в вашем файле журнала, а затем подумайте, стоит ли проверять путь к классам. В этой статье мы увидим фрагмент кода, который будет генерировать исключение во время статической инициализации и вызывать «Exception in thread» main «java.lang.ExceptionInInitializerError». В следующем разделе мы увидим, как решить эту проблему.
Причина исключения в потоке «основной» java.lang.ExceptionInInitializerError
Как и другие ошибки или исключения, когда вы видите эту строку информации, вы знаете, что это ExceptionInInitializerError. Это исключение вызвано сбоем процесса инициализации статического блока во время процесса загрузки класса. Поскольку он появляется в главном потоке, отвечающем за запуск программы, лучше всего начинать анализ с основного класса. Здесь основной класс ссылается на тот, который вы указали в параметрах командной строки, или вы объявили public static void main (Строковые аргументы []). Если вы внимательно посмотрите на трассировку полного стека, вам на самом деле ничего не нужно делать, потому что JVM напечатала имя класса. Это класс, который вызывает ExceptionInInitializerError. ExceptionInInitializerError является подклассом LinkageError, что означает, что это исключение приведет к тому, что ваш класс не сможет загрузиться в память JVM. Теперь давайте посмотрим на этот пример программы, которая при выполнении выдает следующее исключение:
Exception in thread «main» java.lang.ExceptionInInitializerError
at java.util.ArrayList.rangeCheck(ArrayList.java: 635 )
at java.util.ArrayList.get(ArrayList.java: 411 )
at StaticInitiazerDemo. (StaticInitiazerDemo.java: 15 )
Глядя на информацию трассировки стека, вы знаете, что настоящим исключением является java.lang.IndexOutOfBoundsException, которое было выброшено во второй строке StaticInitiazerDemo. Это потому, что вы вызываете метод get () ArrayList и передаете в позицию 0, а размер этого ArrayList также равен 0 (индекс: 0, размер: 0). Увидев это сообщение, вы знаете, что когда мы хотим взять первую кредитную карту из списка, список становится пустым.
* Java Program to understand and solve ExceptionInitializerError, which comes
* When static initializer blocks throws unchecked exception during class loading
public class StaticInitializerDemo<
private static final List cards = new ArrayList ();
Встроенные исключения в Java с примерами
Встроенные исключения — это исключения, доступные в библиотеках Java. Эти исключения подходят для объяснения определенных ошибок. Ниже приведен список важных встроенных исключений в Java.
Примеры встроенных исключений:
// Java-программа для демонстрации
// ArithmeticException
public static void main(String args[])
int c = a / b; // нельзя делить на ноль
System.out.println( «Result = » + c);
catch (ArithmeticException e) <
System.out.println( «Can’t divide a number by 0» );
Выход:
// Java-программа для демонстрации
// ArrayIndexOutOfBoundException
public static void main(String args[])
a[ 6 ] = 9 ; // доступ к 7-му элементу в массиве
catch (ArrayIndexOutOfBoundsException e) <
System.out.println( «Array Index is Out Of Bounds» );
Выход:
// Java-программа для иллюстрации
// концепция ClassNotFoundException
public static void main(String[] args)
System.out.println( «Class created for» + o.getClass().getName());
Выход:
// Java-программа для демонстрации
// FileNotFoundException
public static void main(String args[])
// Следующий файл не существует
File file = new File( «E:// file.txt» );
FileReader fr = new FileReader(file);
catch (FileNotFoundException e) <
System.out.println( «File does not exist» );
Выход:
// Java-программа для иллюстрации IOException
public static void main(String args[])
FileInputStream f = null ;
f = new FileInputStream( «abc.txt» );
System.out.print(( char )i);
Выход:
// Java-программа для иллюстрации
// InterruptedException
public static void main(String args[])
Thread t = new Thread();
Выход:
// Java-программа для иллюстрации
// NoSuchMethodException
i = Class.forName( «java.lang.String» );
Class[] p = new Class[ 5 ];
catch (SecurityException e) <
catch (NoSuchMethodException e) <
catch (ClassNotFoundException e) <
public static void main(String[] args)
Выход:
// Java-программа для демонстрации NullPointerException
public static void main(String args[])
String a = null ; // нулевое значение
catch (NullPointerException e) <
Выход:
// Java-программа для демонстрации
// NumberFormatException
public static void main(String args[])
int num = Integer.parseInt( «akki» );
catch (NumberFormatException e) <
System.out.println( «Number format exception» );
Выход:
// Java-программа для демонстрации
// StringIndexOutOfBoundsException
public static void main(String args[])
String a = «This is like chipping » ; // длина 22
char c = a.charAt( 24 ); // доступ к 25-му элементу
catch (StringIndexOutOfBoundsException e) <
Выход:
Некоторые другие важные исключения
// Java-программа для иллюстрации
// ClassCastException
public static void main(String[] args)
String s = new String( «Geeks» );
Object o1 = new Object();
String s1 = (String)o1;
// Java-программа для иллюстрации
// StackOverflowError
public static void main(String[] args)
public static void m1()
public static void m2()
// Java-программа для иллюстрации
// NoClassDefFoundError
public static void main(String[] args)
System.out.println( «HELLO GEEKS» );
// Java-программа для иллюстрации
// ExceptionInInitializerError
static int x = 10 / 0 ;
public static void main(String[] args)
Код 2:
// Java-программа для иллюстрации
// ExceptionInInitializerError
public static void main(String[] args)
Объяснение: Вышеуказанное исключение возникает всякий раз, когда выполняется статическое присвоение переменной и статический блок, если возникает какое-либо исключение.
// Java-программа для иллюстрации
// IllegalArgumentException
public static void main(String[] args)
Thread t = new Thread();
Thread t1 = new Thread();
t.setPriority( 7 ); // Верный
t1.setPriority( 17 ); // Исключение
Объяснение: Исключение возникает явно либо программистом, либо разработчиком API, чтобы указать, что метод был вызван с недопустимым аргументом.
// Java-программа для иллюстрации
// IllegalStateException
public static void main(String[] args)
Thread t = new Thread();
Объяснение: Вышеуказанное исключение явно возникает либо программистом, либо разработчиком API, чтобы указать, что метод был вызван в неправильное время.
// Java-программа для иллюстрации
// AssertionError
public static void main(String[] args)
// Если х не больше или равно 10
// тогда мы получим исключение во время выполнения
Объяснение: Вышеуказанное исключение явно вызывается программистом или разработчиком API, чтобы указать, что утверждение assert не выполнено.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.





