【问题标题】:Usage of Initialization On Demand Holder idiom is giving NoClassDefFoundErrorInitialization On Demand Holder 习惯用法的用法是给 NoClassDefFoundError
【发布时间】: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


【解决方案1】:

正如问题的 cmets 中已经写的那样:很可能存在 构造函数中抛出的异常,然后显示为 java.lang.NoClassDefFoundError。检查堆栈跟踪。

(我遇到了同样的问题,SO 帮助我们仔细研究了构造函数,我喜欢接受答案的问题,所以这是我的综述。)

【讨论】:

  • 是的。我在发布问题后 2 年就知道了。想回答我自己的问题,但太懒了。无论如何感谢您的回答。
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多