我们在部署代码时,明明类存在,但是发现报错: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.<clinit>(Test.java:9)
Exception in thread "main"
分析其中的原因:我们通过debug模式调试,可以看到logger=null。
结论:成员变量的初始化顺序导致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();
}
}
执行结果:文章来源:https://www.toymoban.com/news/detail-786206.html
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信息
可以看到正确输出结果。文章来源地址https://www.toymoban.com/news/detail-786206.html
到了这里,关于JAVA运行时类存在,但是报错:NoClassDefFoundError: Could not initialize class的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!