修复 java.lang.noclassdeffounderror: could not initialize class 错误
本篇文章我们将了解另一个运行时错误:java.lang.noclassdeffounderror: could not initialize class。 首先,我们将浏览一个出现此错误的 java 程序,这将导致讨论可能的原因并找出哪一行代码导致了此错误。
最后,我们还将了解消除此错误的ag捕鱼王app官网的解决方案。
java 程序出现 java.lang.noclassdeffounderror:could not initialize class 错误
示例代码:
public class propholder {
public static properties prop;
static {
// write code to load the properties from a file
}
}
示例代码:
import java.util.properties;
public class main{
public static void main(string[] args){
//set your properties here
//save the properties in a file
// referencing the propholder.prop:
properties prop = propholder.prop;
//print the values of all properties
}
}
这里,我们有两个名为 propholder 和 main 的 .java 类。 propholder 类从指定文件加载属性,而 main 类设置它们并将它们保存到文件中。
它还引用 propholder 类的 prop 变量来打印所有属性的值。
当我们在本地计算机上运行此 java 代码时,它可以正常工作,但当使用某些脚本部署在 linux 服务器上时,它就无法工作。 为什么会这样呢? 让我们找出原因。
java.lang.noclassdeffounderror:could not initialize class 错误的可能原因
首先,请记住,获得 java.lang.noclassdeffounderror 不仅仅意味着我们的类丢失了。 如果是这样,我们将得到 java.lang.classnotfoundexception。
这也不意味着字节码 (.class) 丢失(在这种情况下,我们会收到类似 java.lang.noclassdeffounderror: classname 的错误)。
因此,java.lang.noclassdeffounderror: could not initialize class
错误意味着它无法找到类文件。 它可能是由下面列出的不同原因引起的。
- 问题可能出在静态块(也称为静态初始化程序)中。 它会出现一个未捕获的异常,发生并传播到尝试加载类的实际类加载器。
- 如果异常不是由静态块引起的,则可能是在创建名为 propholder.prop 的静态变量时出现的。
- 可能该类在指定的 java classpath 中不可用。
- 我们可能已经使用 jar 命令执行了 java 程序,而 manifest 文件的 classpath 属性中没有定义类。
- 此错误可能是由覆盖 classpath 环境变量的启动脚本引起的。
- 另一个原因可能是缺少依赖项。 例如,本机库可能不可用,因为 noclassdeffounderror 是 java.lang.linkageerror 的子类。
-
我们还可以在日志文件中查找
java.lang.exceptionininitializererror
,因为 noclassdeffounderror 可能是由于静态初始化失败而发生的。 -
如果其中一人在 j2ee 环境中工作,那么类在不同 classloader 中的可见性可能会导致
java.lang.noclassdeffounderror
错误。 - 有时,它是由于jre/jdk版本错误引起的。
-
当我们在机器上使用 openjdk 版本 8.x.x 编译某些内容时,也可能会发生这种情况。 我们推送/提交,但其他人已将其 java_home 配置为某个 11.x jdk 版本。
在这里,我们可以得到classnotfounderror、noclassdeffounderror等。所以,最好检查一下程序是用什么jdk编译的。
消除 java.lang.noclassdeffounderror: could not initialize class 错误的ag捕鱼王app官网的解决方案
在我们的例子中,类加载器在尝试读取类时读取类定义时遇到了错误。 因此,在静态初始化器中放置一个 try-catch 块将解决该问题。
请记住,如果我们在那里读取一些文件,那么它将与我们的本地环境不同。
示例代码:
//import libraries
import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.ioexception;
import java.io.inputstream;
import java.util.properties;
import java.util.logging.level;
import java.util.logging.logger;
//propholder class
public class propholder {
//static variable of type properties
public static properties prop;
//static block, which loads the properties
//from the specified file
static {
try {
inputstream input = new fileinputstream("properties");
prop = new properties();
prop.load(input);
} catch (filenotfoundexception ex) {
logger.getlogger(propholder.class.getname()).log(level.severe, null, ex);
} catch (ioexception ex) {
logger.getlogger(propholder.class.getname()).log(level.severe, null, ex);
}
}//end static block
}//end propholder class
在上面的类中,我们创建了一个名为 prop 的 properties 类型的静态变量,我们在 static 块中使用它。 在静态块内,我们创建了一个 fileinputstream 对象,该对象从文件系统中的指定文件获取输入字节。
接下来,我们通过调用properties类的构造函数来初始化prop变量,该变量用于从指定文件加载属性。 请记住,只有在我们运行应用程序后才会执行此静态块。
示例代码:
//import libraries
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.outputstream;
import java.util.properties;
import java.util.logging.level;
import java.util.logging.logger;
//main class
public class main {
//main()
public static void main(string[] args) {
/*
instantiate the properties class, set various
properties and store them in a given file
*/
properties prop = new properties();
prop.setproperty("db.url", "localhost");
prop.setproperty("db.user", "user");
prop.setproperty("db.password", "password");
try {
outputstream output = new fileoutputstream("properties");
prop.store(output, null);
} catch (filenotfoundexception ex) {
logger.getlogger(propholder.class.getname()).log(level.severe, null, ex);
} catch (ioexception ex) {
logger.getlogger(propholder.class.getname()).log(level.severe, null, ex);
}
/*
reference the `propholder.prop` to access the values of
the properties that we set previously
*/
properties obj = propholder.prop;
system.out.println(obj.getproperty("db.url"));
system.out.println(obj.getproperty("db.user"));
system.out.println(obj.getproperty("db.password"));
}//end main()
}//end main
在main类中,我们实例化properties类来设置各种属性的值并将它们保存在指定的文件中。 接下来,我们引用 propholder.prop 来访问 db.url、db.user 和 db.password 属性的值,并将它们打印在程序输出控制台上,如下所示。
输出:
localhost
user
password
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
如何在 java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:java
-
本篇文章主要介绍如何在 java 中制造程序延迟。本教程介绍了如何在 java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 java 中把 hashmap 转换为 json 对象
发布时间:2023/12/17 浏览次数:187 分类:java
-
它描述了允许我们将哈希图转换为简单的 json 对象的方法。本文介绍了在 java 中把 hashmap 转换为 json 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 json 对象的详细例子。
发布时间:2023/12/17 浏览次数:171 分类:java
-
本文介绍了如何在 java 中按值对 map 进行排序。本教程介绍了如何在 java 中按值对 map
进行排序,并列出了一些示例代码来理解它。
如何在 java 中打印 hashmap
发布时间:2023/12/17 浏览次数:192 分类:java
-
本帖介绍了如何在 java 中打印 hashmap。本教程介绍了如何在 java 中打印 hashmap 元素,还列举了一些示例代码来理解这个主题。
在 java 中更新 hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:java
-
本文介绍了如何在 java 中更新 hashmap 中的一个值。本文介绍了如何在 java 中使用 hashmap 类中包含的两个方法-put() 和 replace() 更新 hashmap 中的值。
java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:java
-
本文介绍了 java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 java 中 map 和 hashmap 之间的主要区别。在 java 中,map 是用于以键值对存储数据的接口,
发布时间:2023/12/17 浏览次数:218 分类:java
-
这篇文章向你展示了如何在 java 中获取用户主目录。本教程介绍了如何在 java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:java
-
这篇文章教你如何知道 java 中大小和长度之间的区别。本教程介绍了 java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:java
-
了解有关 java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,