空NoClassDefFoundError的原因是什么?

时间:2013-01-23 08:38:23

标签: java exception classloader

我收到NoClassDefFoundError,消息值为null。我不知道哪个类有初始化问题。顶级跟踪是类的构造函数,而不是类的静态部分。造成这种例外的原因是什么?

java.lang.NoClassDefFoundError
    at com.company.xyz.FooBar.<init>(FooBar:76) 
    ....

FooBar第76行的代码:

drv = data.get( i ).getDrivers();
drvnameToAdd = Msg.getMsg( "msgkey" ); <-- line 76
allNotImported.add( drvnameToAdd );

来自Msg类的一些代码:

private static final ResourceBundle LANGUAGE_RESOURCES;
static {
    LANGUAGE_RESOURCES = ResourceBundle.getBundle( "com.company.xyz.i18n.LanguageResources" );
}

public static String getMsg( String msgID ) {
    String msg;
    try {
        msg = LANGUAGE_RESOURCES.getString( msgID );
    } catch( Throwable e ) {
        msg = "$" + msgID + "$";
    }
    return msg;
}

3 个答案:

答案 0 :(得分:0)

我认为您正在使用依赖于另一个.jar文件的库(.jar)文件,但您没有当前项目中包含的依赖.jar文件。请列出完整的错误消息,以便我们可以看到确切的问题= D

答案 1 :(得分:0)

大多数时候java.lang.NoClassDefFoundError不是实际问题。在此之前应该有另一个例外。 对此类的任何访问都将触发NoClassDefFound,但它仅表示未加载该类。它没有告诉你原因。第76行可能会得到答案。

答案 2 :(得分:0)

最有可能的是,您的代码针对特定版本的库进行编译,并且正在针对另一个版本运行。这基本上是一个连锁错误。 识别导致问题的库并不总是微不足道的,但是行号应该表明在错误发生时正在加载哪个类。

更新:在您发布的堆栈跟踪中,错误源自com.company.xyz.FooBar类的构造函数(第76行),毫无疑问是gov.nasa的替身。 programs.supersecret.bases.alphacentauri。

该类必须依赖于另一个在该点无法加载的类,很可能是因为它在编译时的确切版本中不存在。请注意,实际问题可能会在链中进一步发生,因此如果您将其排除在外,请务必查看该类的依赖关系。