Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
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 модели:
я не знаю, какая стратегия делегации JPF classloader использование, но ключ - то, что Вы хотите, чтобы одна версия dom библиотеки была загружена и все для определения источника того класса от того же местоположения. Это может означать удалять его из пути к классу и загружаться как плагин или препятствовать тому, чтобы Батик загрузил его, или что-то еще.
Походит на 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 волшебство быть в состоянии реализовать, это - сменные функции?
Можно ли определить загрузчик класса? В противном случае попытайтесь определить загрузчик класса контекста как так:
Thread thread = Thread.currentThread();
ClassLoader contextClassLoader = thread.getContextClassLoader();
try {
thread.setContextClassLoader(yourClassLoader);
callDom4j();
} finally {
thread.setContextClassLoader(contextClassLoader);
}
я не знаком с Платформой Плагина Java, но я пишу код для Eclipse, и я время от времени сталкиваюсь с подобными проблемами. Я не гарантирую, что это зафиксирует его, но это, вероятно, стоит того, чтобы попытаться.
Я нахожу этот класс, который будет загружен дважды. Найдите, что причина состоит в том, что класс загрузки parallelWebappClassLoader отдельно сначала, а не использует, это - родитель classLoader.
Ответы Алекса и Мэтта очень полезны. Я тоже мог бы извлечь пользу из их анализа.
У меня была такая же проблема при использовании библиотеки Batik в среде Netbeans RCP, при этом библиотека Batik была включена как «модуль оболочки библиотеки». Если какой-либо другой модуль использует API XML,