Elettracompany.com

Компьютерный справочник
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Exceptionininitializererror java что это

Java: ExceptionInInitializerError при запуске программы

При запуске моя программа сразу же бросит ExceptionInInitializerError. Источник находится от этого метода:

Я распечатал различные части строки и обнаружил, что ошибка возникает только тогда, когда я вызываю form.format(date). Там написано, что это null. Единственная проблема заключается в том, что и дата, и форма статически объявлены прямо над этим методом как таковые:

Ошибка внезапно начала выбрасываться после некоторого незначительного исправления ошибки. Я понятия не имею, что здесь не так и как вообще что-то может быть не так. Я имею в виду, что я вызываю статически объявленные переменные в том же классе. Технически, они не должны быть null, но они есть. У кого-нибудь есть идеи, почему он выбрасывает эту ошибку? Вот вывод консоли:

Кстати, A$.OpSystem.getOperatingSystem отображается там только потому, что он вызывает A$.errorMessage.

И у меня уже была эта проблема раньше, это было как раз тогда, когда статически объявленная переменная фактически никогда не объявлялась как оставшаяся null, когда она была вызвана. Теперь это не должно быть null, но это так. Так что я понятия не имею, что его вызывает. Идеи?

Но я думаю, что это хорошее время, чтобы получить образование о том, как статические переменные на самом деле загружаются.

EDIT: похоже, что никакого исключения не возникает, если я перемещаю статический объект Курсора, вызывающий ‘loadCursor’, в другой класс. Что?

Я сделал тест этой ситуации, но он не возвращает никакой ошибки?

2 Ответа

После изучения вашего исключения trace.

Становится ясно , что некоторая статическая инициализация поля в A$ выполняется до инициализации date и form и вызова loadCursor , который затем логически завершается неудачей с NullPointerException , поскольку date и form неинициализированы.

Проблема в том, что вы разместили код, который инициализирует ваш Cursor , перед тем, который инициализирует ваши объекты date и form . Статические поля с назначениями во время объявления инициализируются в порядке объявления, согласно разделу §8.3.2.1 спецификации языка Java .

Если вы прочтете подробный процесс инициализации, в частности раздел §12.4.2.9, вы найдете.

Затем выполните инициализаторы переменных класса и статические инициализаторы класса или инициализаторы полей интерфейса в текстовом порядке, как если бы они были одним блоком.

Итак, вы, вероятно, делаете что — то вроде этого:

loadCursor не должен вызываться до инициализации date и form , если вы хотите, чтобы это сработало.

Причина, по которой ваш пример не производит ‘error’ (а?) происходит потому, что ни один из методов не ссылается на еще неинициализированное поле. Если вы хотите получить эквивалентное поведение, которое никоим образом не является ошибкой, см. Следующее (которое можно увидеть здесь ):

Выход можно увидеть следующим образом.

Я думаю, вы обнаружите, что проблема возникает здесь

Возможно, вам придется сделать что-то более похожее

Или аналогично 😛

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

Я получаю ошибку при запуске программы Java без main(),но я использовал только статический блок, чтобы проверить, будет ли программа выполняться или нет main().Is есть любой другой способ выполнить.

Мне нужно знать, какая последовательность JVM следует при запуске пользовательской программы. Допустим, пользователь создал программу Runner.java и создал для нее файл jar с именем runner.jar .

В настоящее время я работаю над проектом c# wpf. Я добавил код в программу, чтобы он создавал раздел реестра для автоматического запуска программы при входе пользователя в систему, а также написал.

Я скомпилировал программу она не имеет ошибок но при запуске я получаю ошибку: не удалось найти или загрузить frame.java Я сохранил имя программы как frame.java и запустил как java frame.java import.

Я делал некоторые тесты с этой страницы: http://scjptest.com/mock-test.xhtml?исполнение=e7s1 и возник вопрос What is the result when this program is executed?. Вот код: public class SuperHotel <.

Есть ли какая-нибудь команда или что-то подобное, чтобы узнать имя JIT, используемое при запуске программы java?

Когда я определяю статические или постоянные члены, например: public static final Font BIG_FONT = new Font(, Font.BOLD, 18); Я заметил, что они загружаются только тогда, когда я их впервые.

Я пишу библиотеку для Java, в которой есть несколько файлов, которые нужно записать при запуске программы (если они еще не существуют). Однако большинство библиотек не включают метод ‘main’.

Проект а зависит от проекта В. На время компиляции, все OK. При отладке, когда вызывается статическая функция из класса bClass проекта B, я получаю NoClassDefFoundError . На бегу, я получаю.

Встроенные исключения в Java с примерами

Встроенные исключения — это исключения, доступные в библиотеках Java. Эти исключения подходят для объяснения определенных ошибок. Ниже приведен список важных встроенных исключений в Java.
Примеры встроенных исключений:

    Арифметическое исключение: оно генерируется, когда в арифметической операции возникло исключительное условие.

// Java-программа для демонстрации
// ArithmeticException

public static void main(String args[])

int a = 30 , b = 0 ;

int c = a / b; // нельзя делить на ноль

System.out.println( «Result = » + c);

catch (ArithmeticException e) <

System.out.println( «Can’t divide a number by 0» );

Выход:

ArrayIndexOutOfBounds Исключение: выдается для указания на доступ к массиву с недопустимым индексом. Индекс либо отрицательный, либо больше или равен размеру массива.

// Java-программа для демонстрации
// ArrayIndexOutOfBoundException

Читать еще:  Java lang string что это

public static void main(String args[])

int a[] = new int [ 5 ];

a[ 6 ] = 9 ; // доступ к 7-му элементу в массиве

catch (ArrayIndexOutOfBoundsException e) <

System.out.println( «Array Index is Out Of Bounds» );

Выход:

ClassNotFoundException: это исключение возникает, когда мы пытаемся получить доступ к классу, определение которого не найдено.

// Java-программа для иллюстрации
// концепция ClassNotFoundException

public static void main(String[] args)

Object o = class .forName(args[ 0 ]).newInstance();

System.out.println( «Class created for» + o.getClass().getName());

Выход:

FileNotFoundException: это исключение возникает, когда файл недоступен или не открывается.

// 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» );

Выход:

IOException: это бросается, когда операция ввода-вывода потерпела неудачу или прервалась

// Java-программа для иллюстрации IOException

public static void main(String args[])

FileInputStream f = null ;

f = new FileInputStream( «abc.txt» );

while ((i = f.read()) != — 1 ) <

System.out.print(( char )i);

Выход:

InterruptedException: он генерируется, когда поток ожидает, спит или выполняет некоторую обработку, и прерывается.

// Java-программа для иллюстрации
// InterruptedException

public static void main(String args[])

Thread t = new Thread();

Выход:

NoSuchMethodException: t выбрасывается при доступе к методу, который не найден.

// 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)

Выход:

NullPointerException: это исключение возникает при обращении к членам нулевого объекта. Null ничего не представляет

// Java-программа для демонстрации NullPointerException

public static void main(String args[])

String a = null ; // нулевое значение

catch (NullPointerException e) <

Выход:

NumberFormatException: это исключение возникает, когда метод не может преобразовать строку в числовой формат.

// Java-программа для демонстрации
// NumberFormatException

public static void main(String args[])

int num = Integer.parseInt( «akki» );

catch (NumberFormatException e) <

System.out.println( «Number format exception» );

Выход:

StringIndexOutOfBoundsException: он вызывается методами класса String, чтобы указать, что индекс либо отрицателен, чем размер строки.

// Java-программа для демонстрации
// StringIndexOutOfBoundsException

public static void main(String args[])

String a = «This is like chipping » ; // длина 22

char c = a.charAt( 24 ); // доступ к 25-му элементу

catch (StringIndexOutOfBoundsException e) <

Выход:

Некоторые другие важные исключения

    ClassCastException

// Java-программа для иллюстрации
// ClassCastException

public static void main(String[] args)

String s = new String( «Geeks» );

Object o = (Object)s;

Object o1 = new Object();

String s1 = (String)o1;

StackOverflowError

// Java-программа для иллюстрации
// StackOverflowError

public static void main(String[] args)

public static void m1()

public static void m2()

NoClassDefFoundError

// Java-программа для иллюстрации
// NoClassDefFoundError

public static void main(String[] args)

System.out.println( «HELLO GEEKS» );

ExceptionInInitializerError
Код 1:

// Java-программа для иллюстрации
// ExceptionInInitializerError

static int x = 10 / 0 ;

public static void main(String[] args)

Код 2:

// Java-программа для иллюстрации
// ExceptionInInitializerError

public static void main(String[] args)

Объяснение: Вышеуказанное исключение возникает всякий раз, когда выполняется статическое присвоение переменной и статический блок, если возникает какое-либо исключение.

IllegalArgumentException

// Java-программа для иллюстрации
// IllegalArgumentException

public static void main(String[] args)

Thread t = new Thread();

Thread t1 = new Thread();

t.setPriority( 7 ); // Верный

t1.setPriority( 17 ); // Исключение

Объяснение: Исключение возникает явно либо программистом, либо разработчиком API, чтобы указать, что метод был вызван с недопустимым аргументом.

IllegalArgumentException

// Java-программа для иллюстрации
// IllegalStateException

public static void main(String[] args)

Thread t = new Thread();

Объяснение: Вышеуказанное исключение явно возникает либо программистом, либо разработчиком API, чтобы указать, что метод был вызван в неправильное время.

AssertionError

// Java-программа для иллюстрации
// AssertionError

public static void main(String[] args)

// Если х не больше или равно 10

// тогда мы получим исключение во время выполнения

Объяснение: Вышеуказанное исключение явно вызывается программистом или разработчиком API, чтобы указать, что утверждение assert не выполнено.

Эта статья предоставлена Бишал Кумар Дубей . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Ява.ленг.ExceptionInInitializerError вызвано: java.ленг.Исключение NullPointerException

это из примера OCJP. Я написал следующий код

выход: java.ленг.ExceptionInInitializerError

вызвано: java.ленг.NullPointerException at x[0] = 1;

Почему он бросает NullPointerException , а не ArrayIndexOutOfBoundException .

8 ответов

почему он бросает NullPointerException, а не ArrayIndexOutOfBoundException.

потому что вы не инициализировали массив.

бросается, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • вызов метода экземпляра null объект.
  • доступ или изменение поля нулевого объекта.
  • принимая длину null, как если бы это был массив.
  • доступ или изменение слотов null, как если бы это был массив.
  • выбрасывание null, как если бы это было значение Throwable.

вы попали в точку смелее, так как массив null .

Он бросает NullPointerException, потому что x is null .

х[] объявлен, но не инициализирован.
До инициализации объекты имеют значение null, а примитивы имеют значения по умолчанию (например, 0, false и т. д.)

так что вы должны инициализировать как показано ниже:

static int x[] = новый int[20]; //at the time of declaration of x
или
static int x [];
x = новый int[20]; //after declaring x[] and before using x[] in your code

Читать еще:  Nextint java scanner

ArrayIndexOutOfBoundException произойдет, если массив инициализирован и доступен с незаконным индексом.

Эл.г :
x содержит 20 элементов, поэтому номера индексов от 0 до 19 действительны, если мы обращаемся с любым index или
index > 19 , будет вызвано исключение ArrayIndexOutOfBoundException.

The NullPointerException выкинул в static block , где вы пытаетесь присвоить значение 1 первому элементу массива (x[0] = 1). Будьте в курсе,int[] массив X по-прежнему не intilized.

есть 2 способа для вас, чтобы исправить это.

1 Использовать static int x[] = new int[5]; вместо static int x[] ;

помните: Initialize the array before you use it.

вы не инициализации x массив. Есть разница между объявлением и инициализацией переменных. Когда вы пишете int x[]; вы просто объявляете переменную, которая в качестве поля экземпляра инициализируется значением по умолчанию null . Чтобы фактически создать массив, вы должны написать int x[] = new int[10]; или размер, который вам нужен.

причина получения NullPointerException вместо ArrayIndexOutOfBounds заключается в том, что последний выбрасывается, когда у вас есть массив и пытается обратиться к позиции из его границы, но в вашем случае у вас нет массива вообще и попробуйте поместить что-то в массив без exsting. Вот почему NPE

приводит к NullPointerException, потому что Ваш массив x не инициализирован (равен null)

ArrayIndexOutOfBoundException произойдет, если вы получили доступ к индексу, который находится за пределами:

— Это просто. Здесь x null и вы пытаетесь сохранить значение в неинициализированных array .Отсюда NullPointerException

исключение NullPointerException: Это исключение возникает при попытке получить доступ к свойствам неинициализированного объекта

ArrayIndexOutOfBoundsException: Это исключение возникает, когда массив инициализируется объектом, но при попытке получить доступ к массиву с недопустимым индексом.

в вашем случае, поскольку вы не инициализировать свой объект вы получаете исключение NullPointerException. Вы создали человека с именем «x», но не связали его человек(объект выбора).

Если вы измените строку 2 в,

тогда вы получите ArrayIndexOutOfBoundsException вместо NullPointerException.

ExceptionInInitializerError является непроверенным исключением.

при выполнении статического блока, инициализации статической переменной, если возникает какое-либо исключение, то это ExceptionInInitializerError.

Java.lang.ExceptionInInitializerError в Android

Я пытаюсь создать приложение для Android, которое может проверять лицо. Но когда я пытаюсь запустить свое приложение на своем эмуляторе (используя Eclipse), у меня есть этот результат в моем logcat:

Код для FaceVerificationApplication.java выглядит следующим образом:

Как я могу решить это исключение? Любые советы очень помогают.

Привет, мои проблемы решены. Я должен добавить jna-4.2.2.jar в свои проекты. У меня есть ошибки о родных библиотеках в jna.jar. Поэтому в этом случае в Eclipse я должен перейти в « Настройки»> «Android»> «Сборка»> «Отменить». «Принудительная ошибка, когда внешние банки содержат собственные библиотеки». Тогда моя проблема решена.

Если я читаю это право, он не может найти библиотеку для платформы Java Native Access Platform

В Eclipse в ваших свойствах проекта проверяйте библиотеки для платформы JNA

Прошло несколько лет с тех пор, как я использовал затмение.

Возможно, вам потребуется добавить дополнительные зависимости, которые могут быть здесь https://github.com/java-native-access/jna/tree/master/lib, если у меня есть правильная библиотека.

Для этого вы щелкните правой кнопкой мыши на своем проекте в затмении, а затем перейдите в «Свойства» (должен быть внизу).

Есть несколько вариантов слева, выберите «Java Build Path». Здесь вы можете добавить «Добавить банки» или «Добавить внешние банки». Если вы выберете Add External Jar, вы можете установить его из любого места, если вы выберете Add Jars, который вы можете установить в проекте папки. Я бы добавил папку jar внутри папки проекта и поместил все зависимости jar в противном случае, если вы переместите банки в другую папку, вам нужно сделать это снова.

Добавьте все банки из ссылки и подзаголовков, которые есть. Посмотрите, исправляет ли это проблему. Eclipse сообщит вам, не хватает ли вы зависимостей для своих классов, но он не скажет вам, зависят ли зависимости от зависимостей, пока вы не запустите свой код.

Как уже указывалось другими, у вас есть недостающая зависимость от проекта под названием Java Native Access (JNA) . Если вы внимательно посмотрите на свой StackTrace, вы увидите в конце этого Исключения: java.lang.NoClassDefFoundError: com.sun.jna.Platform . Короткий поиск Google закончился в репозитории выше.

Я бы попытался загрузить все связанные банки, у которых есть префикс Android. Вам также может потребоваться просто android-arm.jar однако это сломает его на устройствах с другим процессором, поэтому добавьте их все.

Вот ответы, поэтому вы знаете, как их решить сейчас. Но это для других. Java имеет отличную обработку сообщений об ошибках, где вы можете найти почти все, что вам нужно для ее исправления. Это только мое мнение и совет: каждый раз смотрите на ПРИЧИНА: part.

Когда у вас есть исключение, посмотрите на последнее сообщение, вызванное сообщением. Например, вот оно: вызвано: java.lang.NoClassDefFoundError: com.sun.jna.Platform. В Java много классов ошибок. Это ошибка от Object-> Throwable-> Error-> LinkageError . Ошибка => Проблема во время выполнения, No class Def Found Error – типичная проблема для загрузчика классов. Все, что вам может понадобиться для объяснения ошибки, – это java docs.

Читать еще:  Как посмотреть ошибки

Кстати, из ваших комментариев в комментариях, вот решение добавить внешнюю библиотеку.

Exceptionininitializererror java что это

Here’s a SSCCE that makes the bug happen at run-time:

[code=java]package enumfail; public class Main < public static void main(String. args) < Constant constant = Constant.CONSTANT; >> enum Constant < CONSTANT; Dumper dumper; Constant() < dumper = new Dumper(); >> class Dumper < Constant constant; Dumper() < System.out.println(Constant.CONSTANT.toString()); >>[/code] Running it produces this stack dump: Part of why this was hard for me to debug is that, in my actual code, the [tt]NullPointerException[/tt] at Line 29 doesn’t appear as the second line of the dump. It appears dozens of lines farther down. Typically, I look at the first line of a dump to see where the problem is. Here, though, it directs me to Line 7, and is complaining about an [tt]ExceptionInInitializerError[/tt]. Well, the problem isn’t really [i]at[/i] Line 7. It’s at Line 29, where an attempt to use the enumerated type value [tt]CONSTANT[/tt] is made.

Recall that the enum class’s constructor is implicitly called for each value when the enum is loaded, which happens the first time any use of the enum is made. That happens here at Line 7. There is only one value, defined at Line 13. The constructor is called for that value, which calls the constructor for the [tt]Dumper[/tt] class, at Line 19. [i]That[/i] call attempts to use the value [tt]CONSTANT[/tt], which is still [tt]null[/tt] at this point, because its constructor hasn’t yet returned. So, the real problem is not at Line 7. It’s at Line 29, where an attempt is made to use a not fully constructed instance of the [tt]Constant[/tt] enum is taking place. The solution might be to defer the creation of the [tt]Dumper[/tt] object to some time after the [tt]Constant[/tt] constructor returns.

Somewhat inelegantly, this fixes the problem: [code=java]package enumfail; public class Main < public static void main(String. args) < Constant constant = Constant.CONSTANT; constant.init(); >> enum Constant < CONSTANT; Dumper dumper; void init() < dumper = new Dumper(); >> class Dumper < Constant constant; Dumper() < System.out.println(Constant.CONSTANT.toString()); >>[/code] The output this time is merely: This is, perhaps, akin to the warnings you get when passing [tt]this[/tt] out of constructors. Interestingly, this code: [code=java]package enumfail; public class Main < public static void main(String. args) < Constant constant = new Constant(); >> class Constant < Dumper dumper; Constant() < dumper = new Dumper(this); System.out.println(this); >> class Dumper < Constant constant; Dumper(Constant constant) < System.out.println(constant.toString()); >>[/code] runs fine, with this output: Further, while there is a «leaking this in constructor» warning at Line 18, there is no such warning at Line 17. I’d be curious to know if anyone can explain that.

Note that the code below generates a compile-time error: [code=java]package enumfail; public class Main < >enum Constant < CONSTANT; Constant() < System.out.println(CONSTANT.toString()); >>[/code] At Line 13, you get, «illegal reference to static field from initializer.» I am guessing this is also akin to the error you get at Line 9 in this code: [code=java]package enumfail; public class Main < static final Integer X; static < System.out.println(X.toString()); >> enum Constant < CONSTANT; Constant() < System.out.println(CONSTANT.toString()); >>[/code] At Line 9, the compiler complains that, «variable X might not have been initialized.» And note that the earlier complaint, «illegal reference to static field from initializer» (now at Line 19), uses the word «initializer,» not «constructor,» which, I think, says something about how enums work.

Anyway, that’s a lesson I learned today. [tt]ExceptionInInitializerError[/tt]s can be caused by attempting to reference an enumerated value from code that is run while the value’s constructor is executing, and has not yet returned.

Junilu Lacar wrote: Circular references tend to create problems like this. I’d question the design before looking for a workaround like that. Why does the Constant enum need to have a reference to the Dumper class anyway?

To make the bug happen.

In the actual product, I have a singleton that is a data model. To avoid creating multiple instances of the view that edits the model, the singleton creates it and sets it visible when the controller asks to edit the model. The model doesn’t know anything about the view, other than how to create it and make it visible. The view needs to be able to access the model, of course, so that’s why there are mutual references.

I could do it with a wrapper class that holds a reference to the model and to the view, and have that create the view and manage its visibility. I’ve done it that way before, but it adds a level of indirection that just confuses me. It’s worth doing when there might be any number of instances of the model, and each could be open for editing, but you still don’t want any instance of the model open in more than one editor at a time. Here, where my model is a singleton, it seems easy enough to just have it create and open/close its one editor itself.

Ссылка на основную публикацию
Adblock
detector