Как иметь дело с LinkageErrors в Java?

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

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

59
задан Krease 3 April 2016 в 03:10
поделиться

5 ответов

LinkageError - то, что Вы войдете в классический случай, где Вам загрузил класс C больше чем один classloader, и те классы используются вместе в том же коде (сравненный, бросьте, и т.д.). Не имеет значения, если это - то же Имя класса или даже если это загружается из идентичной банки - Класс от одного classloader всегда рассматривают как различный Класс, если загружено из другого classloader.

в сообщении (который улучшился много за эти годы) говорится:

Exception in thread "AWT-EventQueue-0" java.lang.LinkageError: 
loader constraint violation in interface itable initialization: 
when resolving method "org.apache.batik.dom.svg.SVGOMDocument.createAttribute(Ljava/lang/String;)Lorg/w3c/dom/Attr;" 
the class loader (instance of org/java/plugin/standard/StandardPluginClassLoader) 
of the current class, org/apache/batik/dom/svg/SVGOMDocument, 
and the class loader (instance of ) for interface org/w3c/dom/Document 
have different Class objects for the type org/w3c/dom/Attr used in the signature

Так, здесь проблема находится в разрешении SVGOMDocument.createAttribute () метод, который использует org.w3c.dom. Attr (часть стандартной библиотеки DOM). Но, версия Attr, загруженного Батиком, была загружена из различного classloader, чем экземпляр Attr, Вы являетесь передающими к методу.

Вы будете видеть, что версия Батика, кажется, загружается из плагина Java. И Ваш загружается из "", который является наиболее вероятным из встроенных загрузчиков JVM (загрузите путь к классу, ESOM или путь к классу).

три видных classloader модели:

  • делегация (значение по умолчанию в JDK - просят порождать, тогда меня)
  • постделегация (распространенный в плагинах, сервлеты и места, где Вы хотите изоляцию - спрашивают меня, затем порождает)
  • одноуровневый элемент (распространенный в моделях зависимости как OSGi, Eclipse, и т.д.)

я не знаю, какая стратегия делегации JPF classloader использование, но ключ - то, что Вы хотите, чтобы одна версия dom библиотеки была загружена и все для определения источника того класса от того же местоположения. Это может означать удалять его из пути к классу и загружаться как плагин или препятствовать тому, чтобы Батик загрузил его, или что-то еще.

62
ответ дан Alex Miller 24 November 2019 в 18:26
поделиться

Походит на classloader проблему иерархии. Я не могу сказать, в какой среде Ваше приложение развертывается, но иногда эта проблема может произойти в веб-среде - где сервер приложений создает иерархию classloaders, напоминая что-то как:

javahome/lib - как корень
appserver/lib - как ребенок корня
webapp/WEB-INF/lib - как ребенок ребенка корня
и т.д.

Обычно classloaders делегат, загружающийся к их родителю classloader (это известно как" parent-first"), и если это classloader не может найти класс, то дочерний classloader пытается. Например, если класс, развернутый как JAR в webapp/WEB-INF/lib, пытается загрузить класс, сначала это просит, чтобы classloader, соответствующий appserver/lib, загрузил класс (который в свою очередь просит, чтобы classloader, соответствующий javahome/lib, загрузил класс), и если этот поиск перестал работать, то WEB-INF/lib ищется соответствие к этому классу.

В веб-среде, можно столкнуться с проблемами с этой иерархией. Например, одна ошибка/проблема, с которой я столкнулся прежде, состояла в том, когда класс в WEB-INF/lib зависел от класса, развернутого в appserver/lib, который в свою очередь зависел от класса, развернутого в WEB-INF/lib. Это вызвало отказы, потому что, в то время как classloaders в состоянии делегировать к родителю classloader, они не могут делегировать, отодвигают дерево. Так, WEB-INF/lib classloader попросил бы, чтобы appserver/lib classloader для класса, appserver/lib classloader загрузил тот класс и попытку загрузить зависимый класс и сбой, так как это не могло найти что класс в appserver/lib или javahome/lib.

Так, в то время как Вы не можете развертывать свое приложение в среде сети/сервера приложений, мое слишком длинное объяснение могло бы относиться к Вам, если Ваша среда имеет иерархию настроенного classloaders. Он? JPF делает своего рода classloader волшебство быть в состоянии реализовать, это - сменные функции?

18
ответ дан matt b 24 November 2019 в 18:26
поделиться

Можно ли определить загрузчик класса? В противном случае попытайтесь определить загрузчик класса контекста как так:

Thread thread = Thread.currentThread();
ClassLoader contextClassLoader = thread.getContextClassLoader();
try {
    thread.setContextClassLoader(yourClassLoader);
    callDom4j();
} finally {
    thread.setContextClassLoader(contextClassLoader);
}

я не знаком с Платформой Плагина Java, но я пишу код для Eclipse, и я время от времени сталкиваюсь с подобными проблемами. Я не гарантирую, что это зафиксирует его, но это, вероятно, стоит того, чтобы попытаться.

5
ответ дан Adam Crume 24 November 2019 в 18:26
поделиться

Я нахожу этот класс, который будет загружен дважды. Найдите, что причина состоит в том, что класс загрузки parallelWebappClassLoader отдельно сначала, а не использует, это - родитель classLoader.

0
ответ дан 24 November 2019 в 18:26
поделиться

Ответы Алекса и Мэтта очень полезны. Я тоже мог бы извлечь пользу из их анализа.

У меня была такая же проблема при использовании библиотеки Batik в среде Netbeans RCP, при этом библиотека Batik была включена как «модуль оболочки библиотеки». Если какой-либо другой модуль использует API XML,

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

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