Различия между NoClassDefFoundError и ClassNotFoundException? - PullRequest
6 голосов
/ 15 июля 2010

NoClassDefFoundError расширяет LinkageError, который в свою очередь расширяет Error.

Javadoc для состояний класса Error:

Error является подклассом Throwable что указывает на серьезные проблемы, которые разумное применение не должен пытаться поймать.

Методы загрузки класса, такие как Class.forName(), объявляют только ClassNotFoundException в предложении throws. Что в дополнение к вышеприведенному описанию Error означает, что мы не должны обычно ловить NoClassDefFoundError при загрузке классов с помощью Class.forName() и т. Д.

Мой вопрос: в каких условиях бросается NoClassDefFoundError вместо ClassNotFoundException?

Ответы [ 2 ]

12 голосов
/ 15 июля 2010

ClassNotFoundException с большей вероятностью будет выброшен ( ваш код) в ситуациях, когда вы вручную загружаете классы - именно для таких вещей, как Class.forName(). Эти имена могут быть получены из пользовательского ввода, например.

NoClassDefFoundError произойдет, когда сам файл класса ссылается на класс, который затем не может быть найден. Класс был когда-то , но сейчас его нет - это не просто ошибка в коде, который пытается отразить отражение, это ошибка развертывания, заключающаяся в том, что не все доступные классы доступны. Насколько я могу сказать, NoClassDefFoundError обычно или, возможно, всегда wrap a ClassNotFoundException - но дело в том, что это не то, что ваш код предназначен для защиты от , поскольку это указывает на среду, которая, вероятно, слишком повреждена для восстановления.

По крайней мере, это мое понимание :)

0 голосов
/ 10 июня 2014

NoClassDefFoundError происходит во время выполнения, поскольку компилятор не может найти файл .class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...