Java NoClassDefFoundError和ClassNotFoundException之间的原因和区别是什么?
Java NoClassDefFoundError和ClassNotFoundException之间的原因和区别是什么?,java,classpath,noclassdeffounderror,classnotfoundexception,Java,Classpath,Noclassdeffounderror,Classnotfoundexception,NoClassDefFoundError和ClassNotFoundException之间有什么区别 是什么原因导致它们被抛出?如何解决这些问题 在修改现有代码以包含新的jar文件时,我经常会遇到这些问题。 对于通过webstart分发的java应用程序,我在客户端和服务器端都找到了它们 我遇到的可能原因: 代码客户端的build.xml中未包含的包 我们正在使用的新JAR缺少运行时类路径 版本与以前的jar冲突 当我今天遇到这些问题时,我会采取循序渐进的方法来解决问题。我需要更加清晰和理解。N
NoClassDefFoundError
和ClassNotFoundException
之间有什么区别
是什么原因导致它们被抛出?如何解决这些问题
在修改现有代码以包含新的jar文件时,我经常会遇到这些问题。
对于通过webstart分发的java应用程序,我在客户端和服务器端都找到了它们
我遇到的可能原因:
build.xml
中未包含的包当我今天遇到这些问题时,我会采取循序渐进的方法来解决问题。我需要更加清晰和理解。
NoClassDefFoundError
基本上是一个链接错误。它发生在您尝试实例化一个对象时(静态地使用“new”),而在编译期间找不到它
ClassNotFoundException
更一般,当您尝试使用不存在的类时,它是一个运行时异常。例如,在接受接口的函数中有一个参数,有人传入实现该接口的类,但您无权访问该类。它还涵盖了动态类加载的情况,例如使用loadClass()
或class。forName()
NoClassDefFoundError
基本上是一个链接错误。它发生在您尝试实例化一个对象时(静态地使用“new”),而在编译期间找不到它
ClassNotFoundException
更一般,当您尝试使用不存在的类时,它是一个运行时异常。例如,在接受接口的函数中有一个参数,有人传入实现该接口的类,但您无权访问该类。它还涵盖了动态类加载的情况,例如使用loadClass()
或class.forName()
与Java API规范的区别如下
用于:
当应用程序试图
通过类的字符串加载类
名称使用:
- 类
中的class
方法forName
- 类
中的ClassLoader
方法findSystemClass
- 类
中的ClassLoader
方法李>loadClass
ClassLoader
实例试图加载
在类的定义中(作为一部分)
属于普通方法调用或作为
使用新实例创建新实例
表达式),并且没有对
可以找到类
已搜索类定义
当前正在执行时存在
类已编译,但定义
再也找不到了
因此,
NoClassDefFoundError
似乎是在成功编译源代码时发生的,但在运行时,找不到所需的class
文件。这可能发生在JAR文件的分发或生产过程中,其中没有包括所有必需的class
文件
至于ClassNotFoundException
,它可能源于试图在运行时对类进行反射调用,但程序试图调用的类不存在
两者之间的区别在于一个是
错误
,另一个是异常
。WithNoClassDefFoundError
是一个错误
,它源于Java虚拟机在查找预期要查找的类时遇到问题。由于找不到类
文件,或者与编译时生成或遇到的文件不同,因此预期在编译时工作的程序无法运行。这是一个非常严重的错误,因为JVM无法启动程序
另一方面,
ClassNotFoundException
是一个异常
,因此它在某种程度上是预期的,并且是可恢复的。使用反射可能容易出错(因为有些人认为事情可能不会按预期进行。没有编译时检查以查看所有必需的类是否存在,因此在运行时会出现查找所需类的任何问题。与Java API规范的区别如下
用于:
当应用程序试图
通过类的字符串加载类
名称使用:
- 类
中的class
方法forName
- 类
中的ClassLoader
方法findSystemClass
- 类
中的ClassLoader
方法loadClass
ClassLoader
实例试图加载
在类的定义中(作为一部分)
属于普通方法调用或作为
使用新实例创建新实例
表达式),并且没有对
可以找到类
已搜索类定义
当前正在执行时存在
类已编译,但定义
再也找不到了
因此,当成功编译源代码时,似乎会出现
NoClassDefFoundError
,但是在运行时,没有找到所需的class
文件。这可能是在JAR文件的分发或生产过程中发生的,因为JAR文件中没有包含所有所需的class
文件
至于ClassNotFoundException
,它可能源于试图在运行时对类进行反射调用,但是cla
java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory
private static SomeClass foo = new SomeClass();
class a {
static class b {}
public static void main(String args[]) {
System.out.println("First attempt new b():");
try {new b(); } catch(Throwable t) {t.printStackTrace();}
System.out.println("\nSecond attempt new b():");
try {new b(); } catch(Throwable t) {t.printStackTrace();}
}
}
First attempt new b():
java.lang.NoClassDefFoundError: a$b
at a.main(a.java:5)
Caused by: java.lang.ClassNotFoundException: a$b
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 1 more
Second attempt new b():
java.lang.NoClassDefFoundError: a$b
at a.main(a.java:7)
public class Test1
{
}
public class Test
{
public static void main(String[] args)
{
Test1 = new Test1();
}
}
Exception in thread "main" java.lang.NoClassDefFoundError: Test
at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
class A{
void met(){
Class.forName("com.example.Class1");
}
}
Class B{
void met(){
com.example.Class2 c = new com.example.Class2();
}
}
ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable
NoClassDefFoundError extends LinkageError extends Error extends Throwable
public class MainClass
{
public static void main(String[] args)
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at pack1.MainClass.main(MainClass.java:17)
class A
{
// some code
}
public class B
{
public static void main(String[] args)
{
A a = new A();
}
}
Exception in thread "main" java.lang.NoClassDefFoundError: A
at MainClass.main(MainClass.java:10)
Caused by: java.lang.ClassNotFoundException: A
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)