`
jag522
  • 浏览: 33867 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

NoClassDefFoundError与ClassNotFoundException的区别

    博客分类:
  • Java
阅读更多
相同点:
1、NoClassDefFoundError和ClassNotFoundException都是类运行时出错。

2、都和classpath有关。

不同点:
1、ClassNotFoundException继承java.lang.Exception,是一种受检异常(checked exception),需要显式地使用try/catch来进行处理。通常需要确保需要的类已经在classpath上了。

--------------------------------
而NoClassDefFoundError继承java.lang.LinkageError,是一种错误(Error)。

2、ClassNotFoundException发生在类加载器在classpath上找不到相关类的时候,通常会使用Class.forName()或ClassLoader.loadClass()或ClassLoader.findSystemClass()。

有时我们会主观地认为类已经在classpath上了,但其实不是,例如jar包中的manifest文件的优先级比当前classpath或-cp选项指定的classpath的优先级都要高,就有可能发生ClassNotFoundException。

还有一种也会发生ClassNotFoundException的场景就是使用两个类加载器,一个类加载器尝试着访问已经被另一个类加载器加载的类也会导致ClassNotFoundException。

--------------------------------
而NoClassDefFoundError相对来说更难诊断出原因。

有时会发生在运行期依赖的类变更了或被删除了,例如下面这个例子,Test类中依赖Test1类,在编译时Test1存在,

编译成功后,删除Test1.class文件,再运行Test类时,就会报错:
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

NoClassDefFoundError还可能发生在类的静态代码块中抛出了异常,例如:

配置文件中没有PROM_REDIS_MAXACTIVE项,是null,导致类的静态代码块出错,从而引起NoClassDefFoundError:
java.lang.NoClassDefFoundError: com.jag.StringSingleCacheClient (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
  • 大小: 2.3 KB
  • 大小: 96 KB
0
1
分享到:
评论

相关推荐

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方案

    这将创建一个连接池,用于与指定的MySQL数据库建立连接。记得在不再需要连接池时调用`dataSource.close()`来释放资源。 总之,要解决`java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource`...

    java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport

    java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理

    java.lang.NoClassDefFoundError错误解决办法

    与ClassNotFoundException的区别 NoClassDefFoundError和ClassNotFoundException都是Java中的类加载错误,但是它们之间有着明显的区别。ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的...

    出现Exception in threadmain java.lang.NoClassDefFoundError的各种可能情况.doc

    如果文件名与类名不符,编译器可能能够成功编译,但运行时会因为找不到正确的类定义而抛出`NoClassDefFoundError`。 ### 解决方法: 确保源文件名与公共类名完全一致,检查文件名的拼写和大小写是否正确。 ### 2. ...

    flink依赖jar包——解决NoClassDefFoundError: com/sun/jersey

    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:...

    JVM类加载跟踪器

    JVM类加载跟踪器,用于排查jar包冲突、类冲突、类版本冲突、NoClassDefFoundError、ClassNotFoundException 等等类加载相关问题的辅助工具

    毕业就业-刷题库Java面试题大全(2021年-2022年).rar

    6. NoClassDefFoundError 和 ClassNotFoundException 区别? 7. try-catch-finally 中哪个部分可以省略? 8. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 9. 类 ExampleA 继承 Exception...

    java 类加载调试

    他们提供的见解有助亍理解和解决常见的 Java 异常,例如 NoClassDefFoundError 和 ClassNotFoundException,以及更有挅戓性的问题,例如类装入器约束迗反和死锁。在第 1 部分中,他们详细描述了 Java 类装入的工作...

    Exception in thread main java.lang.NoClassDefFoundError错误解决方法

    这个错误很容易让人误解为是`ClassNotFoundException`,但实际上它们之间有区别:`ClassNotFoundException`是在类加载器尝试加载特定类但找不到对应的.class文件时抛出的,而`NoClassDefFoundError`则是在类已经被...

    java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/ConditionalTagSupport 问题-附件资源

    java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/ConditionalTagSupport 问题-附件资源

    avro-1.8.1

    运行Sqoop报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/LogicalType,下载此资源放到Sqoop的lib目录下即可

    Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常

    当你看到 `NoClassDefFoundError` 而不是直接的 `ClassNotFoundException` 时,通常意味着类在编译时是可用的,但在运行时无法找到。这可能是因为在编译时使用的类库没有在运行环境中正确配置。 在本例中,问题出在...

    10道Java常见异常面试题含答案(很全)

    6. **NoClassDefFoundError和ClassNotFoundException的区别**: - NoClassDefFoundError是运行时的Error,表明在运行时找不到类定义,可能由于类路径问题或类已被删除。 - ClassNotFoundException是受查异常,通常...

    Java异常面试题(2020最新版).pdf

    6. NoClassDefFoundError和ClassNotFoundException区别? 7. try-catch-finally中哪个部分可以省略? 8. try-catch-finally中,如果catch中return了,finally还会执行吗? 9. 类ExampleA继承Exception,类ExampleB...

    03-Java异常面试题.docx

    NoClassDefFoundError 和 ClassNotFoundException 的区别是什么?try-catch-finally 中哪个部分可以省略?try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?类 ExampleA 继承 Exception,类 ...

    acl-journal:ACL Android开发人员跟踪,7天的代码挑战

    云端同步由于某些问题(不兼容),当我添加Firestore依赖项时(所有/ auth -ui类都抛出了运行时异常,NoClassDefFoundError和ClassNotFoundException),我注释掉了使用Firestore的部分,仅使用了ROOM。 您可以在...

    java异常用于全部的面试

    6. NoClassDefFoundError和ClassNotFoundException的区别在于:NoClassDefFoundError通常发生在运行时,原因是JVM无法找到某个类的定义,而这个类在编译时是存在的。而ClassNotFoundException通常发生在类被动态加载...

    istack包处理少包问题

    在Java编程环境中,我们经常会遇到`ClassNotFoundException`,这是一个运行时异常,表示JVM在尝试加载类时找不到指定的类。在本案例中,错误信息显示为"ClassNotFoundException: ...

Global site tag (gtag.js) - Google Analytics