我正在尝试在数据库连接管理器的代码中实现按需初始化持有人惯用语,以实现延迟加载

Class ConfigurationAgent{
private ConfigurationAgent(){
    String baseDir = "XYZ";
}
private static class LazyLoader{
    private static final ConfigurationAgent instance = new ConfigurationAgent();
}
public static ConfigurationAgent getInstance(){
    ConfigurationAgent cfg = LazyLoader.instance;
    return cfg;
}
}


现在,我使用下面的方法从另一个类中调用此ConfigurationAgent的实例:

ConfigurationAgent agent = ConfigurationAgent.getInstance();


在这种情况下,我得到了ExceptionInInitializerError以及java.lang.NoClassDefFoundError错误。

我的猜测是,静态类LazyLoader无法正确加载,因此“ LazyLoader.instance”调用给了这个问题。 (以下Wiki链接中提到了此问题,而没有任何解决方案http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom
请让我知道如何解决此问题

最佳答案

正如问题注释中所写:很有可能在构造函数中引发了Exception,然后将其显示为java.lang.NoClassDefFoundError。检查堆栈跟踪。

(我遇到了同样的情况,因此SO帮助仔细研究了构造函数,并且我喜欢带有可接受答案的问题,所以这是我的综述。)

10-08 02:28