Использование class.forname (). NewInstance () и «com.sun.jdi.InvocationException произошла исключительная ситуация вызова метода» - PullRequest
0 голосов
/ 09 марта 2011

Я использую class.forname для создания нового экземпляра класса. Имя класса происходит из свойств.

Допустим, у меня есть несколько классов в двух пакетах.

com.package.Parser1
com.package.Parser2
com.package.Parser3

net.package.parser4
net.package.parser5
net.package.parser6

Следующие классы также существуют в вышеуказанных пакетах (это не создаются)

com.package.ParserLoader
com.package.ParserInterface
net.package.GenericParser

При инициализации указанный синтаксический анализатор помещается в вектор. Затем осуществляется доступ к вектору, и каждый класс инициализируется с использованием своего имени класса, как показано ниже

while (tokens.hasMoreTokens())

        parsers.addElement(

            Class.forName((String) tokens.nextToken()).newInstance());
    }catch(Exception e){
        e.printStackTrace();
    }

Код выше находится в классе ParserLoader, который находится в том же пакете, что и парсеры 1,2,3.

Все парсеры 1, 2 и 3 реализуют интерфейс ParserInterface. Парсеры 4,5 и 6 расширяют общий GenericParser. GenericParser реализует интерфейс ParserInterface.

Когда я запускаю вышеизложенное, генерируется исключение, показанное ниже

com.sun.jdi.InvocationException occurred invoking method

Есть идеи, почему это происходит?

Редактировать

Другая проблема, с которой я сталкиваюсь, - я не вижу никакой трассировки стека. Там нет стека трассировки! Я вижу эту ошибку в Eclipse только тогда, когда я отлаживаю приложение и смотрю на содержимое вектора парсеров. Вектор должен содержать ссылки на объекты парсера. Парсеры в пакете com.package. * Хороши, но они не создают экземпляров какого-либо парсера в пакете net.package. *.

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Я думаю, вы получите это исключение, если ваши конструкторы испортились или что-то еще сломалось при создании парсеров. Проверьте это: http://download.oracle.com/javase/6/docs/jdk/api/jpda/jdi/com/sun/jdi/InvocationException.html, и попытайтесь получить больше информации о вашем исключении.

1 голос
/ 09 марта 2011

com.package.ParserInterface звучит как интерфейс, и вы не можете создать экземпляр из интерфейса.

0 голосов
/ 06 июля 2012

Если вы получаете com.sun.jdi.InvocationException в столбце value вкладки Variables панели отладки, наиболее вероятно, что ваши Preferences-Java-Debug-Detail форматеры настроены на отображение toString() для значений переменных.

Если объект еще не полностью построен, но toString() вызывает метод с еще не доступными данными, исключение вызова ожидается и полезно.

Чтобы увидеть более приятный, но избыточный текст, отметьте опцию In detail pane only (или любую другую, относящуюся к вашей версии Eclipse).

...