【问题标题】:Java: static final String population in static block results in NoClassDefFoundErrorJava:静态块中的静态最终字符串填充导致 NoClassDefFoundError
【发布时间】:2017-04-29 21:32:32
【问题描述】:

我有这门课:

public final class Validator {

    private static final String TEST_VALUE = "test";
    private static final String TEST;

    static {
        TEST = TEST_VALUE + "_test";
    }

    private Validator() {}

    public static void validate() {
        //Do something with TEST
    }
}

当我从其他地方拨打Validator.validate() 时,我得到一个java.lang.NoClassDefFoundError: Could not initialize ....Validator

据我从Static block in Java not executed 了解到,最终的静态字符串是在编译时预填充的。

如果变量仅在静态块中定义,是否会出现这种情况?我希望编译器不会尝试预填充该最终变量。

如果不是这样...可能是什么错误?

使用调试器我注意到静态块从未执行,但我不明白为什么...

这是 Java 8 顺便说一句。

更新:

问题是静态块中的 java 错误。 奇怪的是,日志中没有任何错误指向静态块的任何内容,调试器也没有在静态构造函数处停止,所以我认为问题出在其他地方。

【问题讨论】:

  • 你能提供一个MVCE吗?无法重现您的问题并从其他类调用 Validator.validate() 对我来说很好。
  • 你说得对,当我用上面的代码做一个孤立的例子时,没有出现问题,我会做一些研究并在几分钟内更新问题

标签: java string static final static-block


【解决方案1】:
static {
    TEST = TEST_VALUE + "_test";
}

可能不是您的真实代码,因为它不会导致任何运行时异常。
你升 ajava.lang.NoClassDefFoundError 因为可能你在静态块中遇到异常:

static {
        TEST = TEST_VALUE + "_test";
      }

这会阻止加载类。

您应该检查是否适当地记录了至少在程序的标准输出中可能发生的任何异常。

【讨论】:

  • 你是对的。奇怪的是日志中没有任何内容(这可能是由于弹簧框架)。并且使用调试器,它永远不会进入静态块......但我正在缩小静态构造函数中的代码以找到错误
  • 确实,通过一步一步的隔离,你应该会找到的。如果您无法找到原因,请随时编辑您的问题并提供更多详细信息。
  • 问题是一个 .split 函数,其中一个点在静态构造函数中被错误地引用...
  • 太棒了。静态块或类初始化器。 Java 中不存在静态构造函数 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多