JAVA运行时类存在,但是报错:NoClassDefFoundError: Could not initialize class

我们在部署代码时,明明类存在,但是发现报错: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。
debug调试结果
结论:成员变量的初始化顺序导致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信息

可以看到正确输出结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值