最明显的区别:
The difference between the two is that one is an Error
and the other is an Exception
.
ClassNotFoundException一般在ClassLoader去加载的时候如果找不到,直接在加载器里面就跑出了异常,注意是在loader里面抛出来的
NoClassDefFoundError一般是用户类A类引用了自己公司开发的某个框架类B类(B类一般会在jar包里面),而B类里面一般情况会引用第三方著名的jar包,比如commons-log.jar等等,如果你只把包含B类的jar包放入了web-inf/lib,而第三方的commons-log.jar没用放入,虽然编译时成功了,没用问题,可是运行的时候解析B类的时候,B类依赖于C类,而C类找不到,就会抱这个错误
举一个最容易理解的例子
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Class c = Class.forName("com.mycompany.framework.VeryStrong");
System.out.println(c);
}
}
上面是用户的Class,依赖的com.mycompany.framework.VeryStrong作为jar包放入web-inf/lib下面和classpath下面,编译没问题,一切正常
不幸的是,com.mycompany.framework.VeryStrong中声明了一个变量叫public static final Logger log = Logger.getLogger(VeryStrong.class);
在用户servlet被访问的时候,异常抛了出来
这个异常是在VeryStrong中抛出的,因为加载他的时候引用的类没用找到,所以抛出
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
com.mycompany.framework.VeryStrong.<clinit>(VeryStrong.java:36)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Unknown Source)
com.ht.xu.HelloWorldServlet2.doGet(HelloWorldServlet2.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
这个类是在java.net.URLClassLoader类抛出的,因为去load的时候没用找到
java.lang.ClassNotFoundException: org.apache.log4j.Logger
java.net.URLClassLoader$1.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(Unknown Source)
java.lang.ClassLoader.loadClass(Unknown Source)
java.lang.ClassLoader.loadClass(Unknown Source)
com.mycompany.framework.VeryStrong.<clinit>(VeryStrong.java:36)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Unknown Source)
com.ht.xu.HelloWorldServlet2.doGet(HelloWorldServlet2.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
分享到:
相关推荐
JVM类加载跟踪器,用于排查jar包冲突、类冲突、类版本冲突、NoClassDefFoundError、ClassNotFoundException 等等类加载相关问题的辅助工具
文章目录: Java异常架构与异常关键字 Java异常简介 Java异常架构 1. Throwable 2. Error(错误) ...6. NoClassDefFoundError 和 ClassNotFoundException 区别? 7. try-catch-finally 中哪个部分可以省略?
整个系统都没有错误,但是在发布运行后,控制台上却抛出了这样的异常: java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理
NULL 博文链接:https://liuzidong.iteye.com/blog/711509
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
java.lang.NoClassDefFoundError: de/javakaffee/kryoserializers/CurrencySerializer
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig at org.apache.hadoop.yarn.client.api.TimelineClient.createTimelineClient(TimelineClient.java:...
NoClassDefFoundError: org/slf4j/LoggerFactory解决方案,需要添加的三个jar包都在,slf4j-api-1.5.2,slf4j-log4j12-1.5.2,log4j-1.2.12
他们提供的见解有助亍理解和解决常见的 Java 异常,例如 NoClassDefFoundError 和 ClassNotFoundException,以及更有挅戓性的问题,例如类装入器约束迗反和死锁。在第 1 部分中,他们详细描述了 Java 类装入的工作...
jackson-annotations-2.10.2.jar jackson-core-2.10.2.jar jackson-databind-2.10.2.jar NoClassDefFoundError解决
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Message at com.bulktree.mail.SimpleMailTest.mail(SimpleMailTest.java:30) at com.bulktree.mail.SimpleMailTest.main(SimpleMailTest...
解决java.lang.NoClassDefFoundError这个问题,直接导入这几个包就解决了
NULL 博文链接:https://lyndon-lin.iteye.com/blog/856002
jdk升级jdk10后,原本jdk自带的 webservice一些包确实,引起的一系列错误解决方案
JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误 原因: MyEclipse6.5的javaee.jar中的mail包与JavaMail包有冲突。 解决: 在MyEclipse目录下(D:\Program Files\MyEclipse ...
出现Exception in threadmain java.lang.NoClassDefFoundError的各种可能情况.doc
jdk升级之后出现异常:java.lang.NoClassDefFoundError: javax/xml/ws/Service 1、解决方案jdk降级至1.8之前 2、由于JDK9以后,去除了javax.xml包需要引入对应的jar包 <groupId>javax.activation <artifactId>...
java解决Handler processing failed; nested exception is java.lang.NoClassDefFoundError
在jsp运行过程中,报错 java.lang.NoClassDefFoundError org.apache.xml.serializer.TreeWalker时的处理方法。