【发布时间】:2014-08-11 12:22:25
【问题描述】:
我正在尝试在我的代码中为延迟加载的数据库连接管理器实现 Initialization On Demand Holder 习惯用法
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) 请告诉我如何解决此问题
【问题讨论】:
-
不知道你有什么问题?你得到 NoClassDefFoundError 因为
new ConfigurationAgent();抛出异常。你只需要解决这个问题! -
你能告诉我怎么做吗?
-
这取决于您如何实现构造函数 ConfigurationAgent()。你会发布你的异常的完整堆栈跟踪吗?也许你错过了最关键的一个。
-
@turtledove 非常感谢,由于您的输入,我能够弄清楚在我的私有构造函数 ConfigurationAgent() 中我对未正确设置的系统属性进行了一些调用,因此给出了 NullPointerException。因此,没有正确创建类 ConfigurationAgent 的对象,因此出现 NoClassDefFoundError 错误。
标签: java singleton lazy-loading