java.lang.NoClassDefFoundError:如何解决–第3部分

本文是我们的NoClassDefFoundError故障排除系列的第3部分。 正如我在第一篇文章中提到的那样,有许多可能导致NoClassDefFoundError的问题。 本文将重点介绍该问题的最常见原因之一:Java类静态初始化程序块或变量的失败。

将提供一个示例Java程序,我鼓励您从工作站上编译并运行此示例,以正确复制和理解此类NoClassDefFoundError问题。

再谈Java静态初始值设定项

Java编程语言为您提供了“静态”初始化变量或代码块的功能。 这可以通过“静态”变量标识符或在Java类的标头使用static {}块来实现。 静态初始化程序保证在JVM生命周期中只能执行一次 ,并且通过设计是线程安全的,这使其在静态数据初始化(例如内部对象缓存,记录器等)中的使用非常吸引人。

问题是什么? 我将再次重复,保证静态初始化程序在JVM生命周期中只能执行一次……这意味着此类代码在Class加载时执行,并且在您重新启动JVM之前不会再次执行。 现在,如果当时执行的代码(@Class加载时间)以未处理的异常终止会发生什么?

欢迎来到java.lang.NoClassDefFoundError问题案例#2!

NoClassDefFoundError问题案例2 –静态初始化失败

静态初始化程序代码失败,再加上尝试创建受影响的(未加载)类的新实例的连续尝试,便会发生此类问题。

示例Java程序

以下简单的Java程序按以下方式拆分:

–主Java程序NoClassDefFoundErrorSimulator
–受影响的Java类ClassA
– ClassA为您提供一个ON / OFF开关,使您可以复制要研究的问题类型

该程序只是试图尝试创建ClassA的新实例3次(一个接一个)。 它将演示静态变量或静态块初始化程序的初始失败,再加上尝试创建受影响的类的新实例的连续尝试,将触发java.lang.NoClassDefFoundError。

#### NoClassDefFoundErrorSimulator.java
package org.ph.javaee.tools.jdk7.training2;/*** NoClassDefFoundErrorSimulator* @author Pierre-Hugues Charbonneau**/
public class NoClassDefFoundErrorSimulator {/*** @param args*/public static void main(String[] args) {System.out.println("java.lang.NoClassDefFoundError Simulator - Training 2");System.out.println("Author: Pierre-Hugues Charbonneau");System.out.println("http://javaeesupportpatterns.blogspot.com\n\n");              try {                 // Create a new instance of ClassA (attempt #1)System.out.println("FIRST attempt to create a new instance of ClassA...\n");        ClassA classA = new ClassA();} catch (Throwable any) {any.printStackTrace();}             try {                 // Create a new instance of ClassA (attempt #2)System.out.println("\nSECOND attempt to create a new instance of ClassA...\n");        ClassA classA = new ClassA();} catch (Throwable any) {                   any.printStackTrace();}      try {                 // Create a new instance of ClassA (attempt #3)System.out.println("\nTHIRD attempt to create a new instance of ClassA...\n");        ClassA classA = new ClassA();} catch (Throwable any) {                   any.printStackTrace();}             System.out.println("\n\ndone!");}
}
#### ClassA.java
package org.ph.javaee.tools.jdk7.training2;/*** ClassA* @author Pierre-Hugues Charbonneau**/
public class ClassA {private final static String CLAZZ = ClassA.class.getName();// Problem replication switch ON/OFFprivate final static boolean REPLICATE_PROBLEM1 = true; // static variable initializerprivate final static boolean REPLICATE_PROBLEM2 = false; // static block{} initializer// Static variable executed at Class loading timeprivate static String staticVariable = initStaticVariable();// Static initializer block executed at Class loading timestatic {// Static block code execution...if (REPLICATE_PROBLEM2) throw new IllegalStateException("ClassA.static{}: Internal Error!");}public ClassA() {System.out.println("Creating a new instance of "+ClassA.class.getName()+"...");}/**** @return*/private static String initStaticVariable() {String stringData = "";if (REPLICATE_PROBLEM1) throw new IllegalStateException("ClassA.initStaticVariable(): Internal Error!");return stringData;}
}

问题重现

为了复制问题,我们将简单地“自愿”触发静态初始化器代码的失败。 请简单地启用您要研究的问题类型,例如静态变量或静态块初始化程序失败:

// Problem replication switch ON (true) / OFF (false)private final static boolean REPLICATE_PROBLEM1 = true; // static variable initializerprivate final static boolean REPLICATE_PROBLEM2 = false; // static block{} initializer

现在,让我们在两个开关都处于OFF的情况下运行程序(两个布尔值都为false)
##基准(正常执行)

java.lang.NoClassDefFoundError Simulator - Training 2Author: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comFIRST attempt to create a new instance of ClassA...Creating a new instance of org.ph.javaee.tools.jdk7.training2.ClassA...SECOND attempt to create a new instance of ClassA...Creating a new instance of org.ph.javaee.tools.jdk7.training2.ClassA...THIRD attempt to create a new instance of ClassA...Creating a new instance of org.ph.javaee.tools.jdk7.training2.ClassA...done!

对于初始运行(基准),主程序能够成功创建3个ClassA实例,而不会出现问题。

##问题再现运行(静态变量初始化程序失败)

java.lang.NoClassDefFoundError Simulator - Training 2Author: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comFIRST attempt to create a new instance of ClassA...java.lang.ExceptionInInitializerErrorat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:21)Caused by: java.lang.IllegalStateException: ClassA.initStaticVariable(): Internal Error!at org.ph.javaee.tools.jdk7.training2.ClassA.initStaticVariable(ClassA.java:37)at org.ph.javaee.tools.jdk7.training2.ClassA.<clinit>(ClassA.java:16)... 1 moreSECOND attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:30)THIRD attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:39>)done!

##问题再现运行(静态块初始化程序失败)

java.lang.NoClassDefFoundError Simulator - Training 2Author: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comFIRST attempt to create a new instance of ClassA...java.lang.ExceptionInInitializerErrorat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:21)Caused by: java.lang.IllegalStateException>: ClassA.static{}: Internal Error!at org.ph.javaee.tools.jdk7.training2.ClassA.<clinit>(ClassA.java:22)... 1 moreSECOND attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:30)THIRD attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:39)done!

发生了什么? 如您所见,第一次尝试创建ClassA的新实例确实触发了java.lang.ExceptionInInitializerError。 此异常表示我们的静态变量&bloc的静态初始化程序失败,这正是我们想要实现的目标。

此时要了解的关键点是,此故障确实阻止了ClassA的整个类加载。 如您所见,尝试#2和尝试#3都生成了java.lang.NoClassDefFoundError,为什么? 好吧,因为第一次尝试失败了,所以可以防止ClassA的类加载。 连续尝试在当前ClassLoader中创建ClassA的新实例的做法一遍又一遍地产生了java.lang.NoClassDefFoundError,因为在当前ClassLoader中未找到ClassA。

如您所见,在此问题上下文中,NoClassDefFoundError只是另一个问题的症状后果 。 最初的问题是在静态初始化程序代码失败后触发的ExceptionInInitializerError。 这清楚地说明了使用Java静态初始化程序时正确进行错误处理和记录的重要性。

建议和解决策略

现在在下面找到我对NoClassDefFoundError问题案例2的建议和解决策略:
–检查java.lang.NoClassDefFoundError错误并确定缺少的Java类
–对受影响的类执行代码演练,并确定其是否包含静态初始化程序代码(变量和静态块) –检查您的服务器和应用程序日志,确定是否有任何错误(例如ExceptionInInitializerError)源自静态初始化程序代码–确认后,进一步分析代码并确定初始化程序代码失败的根本原因。 您可能需要添加一些额外的日志记录以及适当的错误处理,以防止并更好地处理将来的静态初始化程序代码失败

请随时发表任何问题或评论。

第4部分将开始介绍与类加载器问题有关的NoClassDefFoundError问题。

参考: java.lang.NoClassDefFoundError:如何解决–第3部分,来自我们的JCG合作伙伴 Pierre-Hugues Charbonneau,位于Java EE支持模式和Java教程博客。


翻译自: https://www.javacodegeeks.com/2012/07/javalangnoclassdeffounderror-how-to.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django实现瀑布流、组合搜索、阶梯评论、验证码

django实现图片瀑布流布局 我们在一些图片网站上经常会看到&#xff0c;满屏都是图片&#xff0c;而且图片都大小不一&#xff0c;却可以按空间排列。默认一个div是占用一行&#xff0c;当想把div里的图片并排显示的时候&#xff0c;只能使用float属性&#xff0c;但是&#xf…

通过ifrmae异步下载文档

//通过ifrmae异步下载文档 function iframeGetFile(opts) {var defaultOpts {filePath: ,onload: function (e) { }}, iframeFile;$.extend(defaultOpts, opts);iframeFile document.createElement("iframe");iframeFile.onload function (e) {defaultOpts.onload…

IO与NIO –中断,超时和缓冲区

假设有一个系统有时需要将文件复制到几个位置&#xff0c;但是这种方式在响应速度至关重要的情况下。 换句话说&#xff0c;如果由于某种原因文件系统过载&#xff0c;并且我们无法在不到一秒钟的时间内写入文件&#xff0c;则应该放弃。 ExecutorService是一项非常方便的工作工…

实验5 matlab程序设计2,实验5 Matlab程序设计2

实验5 Matlab程序设计21. 实验目的&#xff1a;2. 掌握建立和执行M文件的方法&#xff1b; 3. 掌握实现选择结构的方法&#xff1b; 4. 掌握实现循环结构的方法。5. 熟悉利用向量运算来代替循环操作的方法。 6. 实验内容&#xff1a;27. 根据61111 122232n2&#xff0c;求π的近…

【poj1041】 John's trip

http://poj.org/problem?id1041 (题目链接) 题意 给出一张无向图&#xff0c;求字典序最小欧拉回路。 Solution 这鬼畜的输入是什么心态啊mdzz&#xff0c;这里用vector储存边&#xff0c;便于边的排序。瞬间变成STL常数boy →_→。 细节 数组大小把握好。 代码 // poj1041 #i…

记一次ora-1652错误的解决过程

报错现象&#xff1a; 通过v$RMAN_BACKUP_JOB_DETAILS查看备份状态&#xff0c;一直卡着不出结果&#xff0c;很长一段时间之后抛出ORA-1652: unable to extend temp segment by 128 in tablespace &#xff0c;此时查看临时表空间使用情况&#xff0c;发现占用很少&#xff0c…

带有docx4j的Java Word(.docx)文档

几个月前&#xff0c;我需要创建一个包含许多表和段落的动态Word文档。 过去&#xff0c;我曾使用POI来实现此目的&#xff0c;但是我发现它很难使用&#xff0c;并且在创建更复杂的文档时对我来说效果不佳。 因此&#xff0c;对于这个项目&#xff0c;经过一番搜索&#xff0c…

mysql中distinct关键字,MySQL关键字Distinct的详细介绍

DDLPrepare SQL&#xff1a;?Prepare Data&#xff1a;?查询数据如下图所示&#xff1a;第一种情况&#xff0c;使用Distinct关键字&#xff0c;查询单列数据&#xff0c;如下图所示&#xff1a;结果&#xff1a;对 name 字段进行去重处理&#xff0c;符合预期期望&#xff0…

#pragma 预处理指令

Linux C 编程一站式学习 #pragma 预处理指示供编译器实现一些非标准的特性&#xff0c;C 标准没有规定 #pragma 后面应该写什么以及起什么作用&#xff0c;由编译器自己规定。有的编译器用 #pragma 定义一些特殊功能寄存器名&#xff0c;有的编译器用 #pragma 定位链接地址&…

px ,em ,rem

做移动端或者响应式的页面必然需要字体的变化的。这次我就自己的经验来说说他们之间的关系&#xff0c;以及怎么用。 px (绝对单位)是我们常用的就不说了。 em&#xff08;相对单位&#xff0c;相对父级&#xff09; em 指字体高&#xff0c;任意浏览器的默认字体高都是16px。所…

使用JAnnocessor生成Java代码

在本文中&#xff0c;我将向你展示如何生成的代码JAnnocessor通过创建框架Nikolche Mihajlovski 。 在Nikolche的演讲中&#xff0c;我第一次在GeeCON 2012大会上遇到JAnnocessor&#xff1a; “创新和实用的Java源代码生成” &#xff08;幻灯片&#xff09; 。 之后&#xff…

Linq学习笔记(转)

开始Linq前你要知道的 扩展方法 顾名思义就是对现有类进行扩展的的方法&#xff0c;扩展方法可以在不修改现有类的情况下&#xff0c;为现有类增加公共的接口&#xff08;不是C#中的interface&#xff09;。 扩展方法本质上是一个静态方法&#xff0c;不同之处在于它的第一个参…

cass展点不在原位置,cass中打开一副图后,通过绘图处理-——展高程点,怎么之前的图形就不显示了,,只剩下高程点!!...

答&#xff1a;1、进入控制面板&#xff0c;选择“卸载或更改程序”。 2、选中“AutoCAD2006”图标。 3、右击选择“更改”。 4、进入“AutoCAD2006安装程序对话框”&#xff0c;选择“添加/删除功能”单选按钮&#xff0c;点击下一步。 5、在“程序文件”列表中&#xff0c;选…

(二)windows下安装PHPCMS V9

一、准备工作 搭建环境 &#xff1a;参考:Windows下搭建PHP开发环境及相关注意事项PHPCMS V9 &#xff1a;下载适合自己 PHPCMS V9 版本到本地或服务器&#xff0c;下载地址&#xff1a;http://www.phpcms.cn/html/download/说明&#xff1a;官方提供了 2 种不同的编码。包括 G…

JavaFX 2.0布局窗格– HBox和VBox

如果要对JavaFX 2.0中所有不同的布局窗格进行概述&#xff0c;或者想了解有关它们的一些基本知识&#xff0c;请参阅我以前的文章《 JavaFX 2.0中的布局窗格》 。 布局窗格HBox和VBox绝对是JavaFX 2.0中最基本的布局容器。 如您所知&#xff0c;它们的用途是将所有子级布置在一…

flask mysql分页,Flask分页的实现方法

所需环境Flask-SQLAlchemy分页使用Flask-SQLAlchemy提供的pagination()方法。页数是pagination()方法的第一个参数&#xff0c;也是唯一必须的参数。可选参数per_page用来指定每页显示的记录数。参考代码&#xff1a;def index():# ...page request.args.get(page, 1, typeint…

Java中的生成器设计模式

Java 中的 Builder设计模式是一种创建模式&#xff0c;即用于创建对象&#xff0c;类似于 工厂方法设计模式 &#xff0c;这也是创建设计模式。 在学习任何设计模式之前&#xff0c;我建议先找出特定设计模式要解决的问题。 众所周知&#xff0c; 必要性是发明的母亲。 在没有面…

验证码( 随机数)

方式一&#xff08;变色版&#xff09;&#xff1a; <html> <head><meta charset"UTF-8"/><title></title><script src"jquery-2.0.2.min.js"></script> </head> <body> <?php header("co…

单片机串行通信全解析

1.什么是串行通信&#xff1f; 串行通信&#xff08;英语&#xff1a;Serial communication&#xff09;是指在计算机总线或其他数据通道上&#xff0c;每次传输一个位元数据&#xff0c;并连续进行以上单次过程的通信方式。与之对应的是并行通信&#xff0c;它在串行端口上通过…

java type 类型,java中的泛型类型与Type接口

假设我们定义了一个Room的类&#xff0c;表示一个房间public classRoom(){}由于我们建造好房间是&#xff0c;不知道房间以后的用途&#xff0c;他可能用来住人&#xff0c;也有可能用来放货物&#xff0c;因此需要用到泛型。但是我们可能想获取Room这个房间里面进来的的东西的…