使用class.forname()。newInstance()和“com.sun.jdi.InvocationException发生调用方法”异常

时间:2011-03-09 15:40:54

标签: java eclipse java-ee introspection

我使用class.forname创建一个新的class实例.classname来自一个属性。

假设我在两个包中有几个类。

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都扩展了abtract GenericParser。 GenericParser实现了ParserInterface。

当我运行上面的内容时,会生成如下所示的异常

com.sun.jdi.InvocationException occurred invoking method

为什么会发生这种情况?

修改

我遇到的另一个问题是我无法看到任何堆栈跟踪。没有堆栈跟踪!我只是在调试应用程序时查看eclipse中的错误并查看解析器向量的内容。向量应包含对解析器对象的引用。 com.package。*包中的解析器很好但是它没有在net.package。*包中创建任何解析器的实例。

3 个答案:

答案 0 :(得分:2)

我认为如果您的构造函数在创建解析器时被搞砸了或者其他东西被破坏了,我会得到这个异常。看看这个:http://download.oracle.com/javase/6/docs/jdk/api/jpda/jdi/com/sun/jdi/InvocationException.html,并尝试从您的例外中获取更多信息。

答案 1 :(得分:1)

com.package.ParserInterface听起来像一个界面,您无法从界面创建实例。

答案 2 :(得分:0)

如果您在调试窗格的com.sun.jdi.InvocationException标签的value列中收到Variables,则很可能您的Preferences-Java-Debug-Detail格式设置设置为{ {1}}表示变量的值。

如果对象尚未完全构建,但toString()调用的方法尚未提供数据,则需要调用异常并提供帮助。

要查看更好但冗余的文本,请检查toString()选项(或与您的Eclipse版本相关的任何内容)。