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

2023-11-10

我们在部署代码时,明明类存在,但是发现报错: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信息

可以看到正确输出结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA运行时类存在,但是报错:NoClassDefFoundError: Could not initialize class 的相关文章

随机推荐

  • Python标准模块--logging

    1 logging模块简介 logging模块是Python内置的标准模块 主要用于输出运行日志 可以设置输出日志的等级 日志保存路径 日志文件回滚等 相比print 具备如下优点 可以通过设置不同的日志等级 在release版本中只输出重
  • 【经典游戏】坦克大战 Unity2D项目实战(保姆级教程)

    主要内容 1 Unity3D引擎中的基础设置 2 2D场景的搭建 预制体制作 3 2D动画的制作 4 图片图集的有关知识 5 碰撞器 触发器 碰撞检测与触发检测 6 2D游戏渲染的一些知识 7 敌人AI的编写 8 UGUI有关内容 场景切换
  • tomcat8.5 启动控制台日志乱码

    使用IDEA在本地启动tomcat进行调试时 发现日志 页面会出现乱码的情况 通过以下方式解决问题 以下操作全部在Windows10系统中 直接启动tomcat会出现控制台汉字乱码的问题 这是因为 tomcat启动默认编码 UTF 8 wi
  • Java+MysQL:Java连接MysQL及进行简单的查询操作

    最近想学习一下Java操作MySQL等数据库的教程 但是把整个网络翻遍也没找到令人满意的教程 各种报错 所以就决定 把自己的学习过程记录下来和大家分享 既可以作为日后复习巩固之用 又可以帮到需要的人 希望可以帮助以后想学习的朋友们少走一些弯
  • Android通知发送原理之Framework实现(基于Android 10)

    前言 这是一个基于 Android 10 源码 全面分析 Android通知系统实现原理 的系列 这是第三篇 全系列将覆盖 这一篇我们将全面分析通知发送在框架层 服务端 的一系列处理 说明 下文出现的简写 NM gt Notificatio
  • 关于组播239.255.255.250

    网络很慢 用SNIFFER监控 观察到内网一个IP10 192 68 66与239 255 255 250有着大量的数据传送 占据大量带宽 各位同仁有没有遇到类似情况 小虾初步怀疑是有人在网内看网络电视导致的 曾经在一个论坛里看见说是一个播
  • Spring Boot项目结构推荐

    Spring Boot框架本身并没有对项目结构有特别的要求 但是按照最佳实践的项目结构可以减少可能会遇见的坑 尤其是Spring包扫描机制的存在 也可以免去不少特殊的配置工作 典型示例一 root package结构 com lyd exa
  • HTML5 WebSocket的入门使用

    HTML5 WebSocket 长连接 客户端与服务端可以保持长时间的通信 一 具体步骤 1 创建一个websocket实例 连接远程服务器并且需要一个连接服务器的url let baseUrl ws echo websocket org
  • Flutter 图表控件使用笔记

    Flutter 图表控件使用笔记 最近有图表绘制需要 记录下现有的Flutter主流实现方式 原文链接 https blog csdn net weixin 44259356 article details 105147636 flutte
  • 数据库复习(4) 实体关系模型

    实体集 Entity Sets 是实际存在的事物 可以是抽象的 具有属性 attributes 实体集是具有共同性质的同类实体的集合 实体集的属性类型划分 简单的和复合的 conposite 如名字等等 单值的 多值的 如电话号码等 直接的
  • (规定时间过桥问题)A、B、C、D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时 1、2、5、10 分钟

    问题描述 A B C D 四个人 要在夜里过一座桥 他们通过这座桥分别需要耗时 1 2 5 10 分钟 只有一支手电 并且同时最多只能两个人一起过桥 请问 如何安排 能够在17分钟内这四个人都过桥 解答思路 核心思想 过桥需要手电 每次让相
  • STM32学习——GPIO

    GPIO就是通用的输入输出端口 通俗的说就是单片机的一些引脚 这些引脚可以控制LED灯 蜂鸣器也可以作为按键输入 ADC采样等 从而实现STM32单片机和外部硬件之间的连接和数据交互 在STM32中以STM32F103C8T6为例 其GPI
  • # `CSP_J_2021` 第一轮认证题

    一 单选题 1 以下不属于面向对象程序设计语言的是 A C B Python C Java D C 2 以下奖项与计算机领域最相关的是 A 奥斯卡奖 B 图灵奖 C 诺贝尔奖 D 普利策奖 3 目前主流的计算机储存数据最终都是转换成 数据进
  • CSS的clip-path属性使用

    前言 clip path CSS 属性使用裁剪方式创建元素的可显示区域 区域内的部分显示 区域外的隐藏 基本语法 clip path clip source basic shape geometry box none 属性说明 clip s
  • iterm2跳板机自动登录脚本

    前言 现在要想访问公司服务器都必须通过跳板机再跳到目标服务器 这么做是运维人员为了安全性考虑和可以高效管理公司庞大的服务器集群 但是我们都知道安全性提高后必定降低我们日常工作的效率 必须先登录到跳板机 再选目标服务器 每次访问服务器都增加了
  • 前端面试题-url、href、src

    一 URL的概念 统一资源定位符 或称统一资源定位器 定位地址 URL地址等 英语 Uniform Resource Locator 常缩写为URL 有时也被俗称为 网页地址 网址 如同在网络上的门牌 是因特网上标准的资源的地址 Addre
  • Python模块学习 ---- atexit

    atexit模块很简单 只定义了一个register函数用于注册程序退出时的回调函数 我们可以在这个回调函数中做一些资源清理的操作 注 如果程序是非正常crash 或者通过os exit 退出 注册的回调函数将不会被调用 我们也可以通过sy
  • 一篇文章让你搞定所有redis面试题

    Redis是什么 Redis是C语言开发的一个开源的 遵从BSD协议 高性能键值对 key value 的内存数据库 可以用作数据库 缓存 消息中间件等 它是一种NoSQL not only sql 泛指非关系型数据库 的数据库 redis
  • Arduino酸度计(PH计)

    在本项目中 我们将通过将模拟pH传感器与Arduino接口来设计pH计 介绍 在化学中 pH是用于指定水基溶液的酸性或碱性的标度 酸性溶液的pH值较低 而碱性溶液的pH值较高 因此 Ph传感器具有确定任何溶液的Ph的能力 即可以判断该物质本
  • JAVA运行时类存在,但是报错:NoClassDefFoundError: Could not initialize class

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