我们在部署代码时,明明类存在,但是发现报错:NoClassDefFoundError: Could not initialize class。 这类问题是由静态成员或静态初始化语句块引起。 我们先看下面个类:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

/**

* 测试代码

*/

public class Test {

private static String msg = getMsg();

private static String getMsg() {

try {

logger.info("getMsg方法输出info日志信息");

} catch (Exception e) {

logger.error("getMsg方法输出error日志信息", e);

}

return "Hello World";

}

private static Log logger = LogFactory.getLog(Test.class);

public void print() {

logger.info("print方法输出info信息");

}

public static void main(String[] args) {

Test test = new Test();

test.print();

}

}

执行结果:

java.lang.ExceptionInInitializerError

Caused by: java.lang.NullPointerException

at Test.getMsg(Test.java:15)

at Test.(Test.java:9)

Exception in thread "main"

分析其中的原因:我们通过debug模式调试,可以看到logger=null。 jvm JAVA运行时类存在,但是报错:NoClassDefFoundError: Could not initialize class  第1张

" /> 结论:成员变量的初始化顺序导致logger获取失败。 接下来我们做一下验证,调整代码如下:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

/**

* 测试代码

*/

public class Test {

private static Log logger = LogFactory.getLog(Test.class);

private static String msg = getMsg();

private static String getMsg() {

try {

logger.info("getMsg方法输出info日志信息");

} catch (Exception e) {

logger.error("getMsg方法输出error日志信息", e);

}

return "Hello World";

}

public void print() {

logger.info("print方法输出info信息");

}

public static void main(String[] args) {

Test test = new Test();

test.print();

}

}

执行结果:

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/D:/Maven/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/D:/Maven/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

14:26:29.076 [main] INFO Test - getMsg方法输出info日志信息

14:26:29.079 [main] INFO Test - print方法输出info信息

可以看到正确输出结果。

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: