Почему не было поймано это исключение - PullRequest
3 голосов
/ 30 апреля 2011

У меня есть следующий код

try {
   xpathInstance = XPath.newInstance(xpathExpr);
       list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
   throw new Exception(e);
}

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

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at org.jdom.xpath.XPath.newInstance(XPath.java:134)
at com.myapp.parser.GenericXMLParser.getSingleNodeValue(GenericXMLParser.java:63)

Согласно документации JDOM, метод newInsance () выбрасывает JDOMEXCeption, поэтому не должен ли он обнаружить ошибку?

Кроме того, как мне избежать добавления предложения catch (Exception e), чтобы избежать неизвестных исключений.

Спасибо

Ответы [ 3 ]

4 голосов
/ 30 апреля 2011

Это исключение не вызывается конструктором. Это поднято загрузчиком класса. Когда он пытается загрузить ваш класс задолго до запуска конструктора, класс не был найден, и возникла исключительная ситуация (ошибка определения класса не найдена), которую вы не обработали (ошибки BTW не могут быть обработаны).

4 голосов
/ 30 апреля 2011

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

Ошибка, которую вы увидели в ошибке времени выполнения, сгенерированной для класса, который, как ожидалось, будет в CLASSPATH , но не был найден. Если jdom.jar действительно включает класс org/jaxen/NamespaceContext, то это должно решить эту проблему.

Согласно документации JDOM, метод newInsance () генерирует JDOMEXCeption так не должно иметь поймал ошибку?

Нет, это не JDOMException, это NoClassDefFoundError, поэтому он его не ловит. Самое главное , это происходит до того, как класс JDOM находится на картинке - происходит во время загрузки класса.

Кроме того, как мне избежать добавления пункт catch (Exception e), чтобы избежать неизвестные исключения

Как правило, вы должны не пытаться поймать NoClassDefFoundError , поскольку это тип ошибки, который подпадает под категорию failures from which recovery is not feasible. Вы можете попытаться обойти это, используя Reflection и поймав ClassNotFoundException, но, как я уже говорил, это исключение, от которого вы не можете оправиться, поэтому попытки его поймать, вероятно, спорный вопрос.

1 голос
/ 30 апреля 2011

Его не поймали, потому что его не бросили. Было сгенерировано исключение java.lang.NoClassDefFoundError

И если вы хотите поймать исключение, вы должны его поймать. Вы ничего не можете сделать, чтобы избежать этого, что могло бы победить весь смысл исключений.

...