zoukankan      html  css  js  c++  java
  • 【译】NoClassDefFoundError和ClassNotFoundException的不同(转)

    https://www.jianshu.com/p/93d0db07d2e3

    本文翻译自:Difference between NoClassDefFoundError vs ClassNotFoundExcepiton in Java


    如果JVM或者ClassLoader在加载类时找不到对应的类,就会引发NoClassDefFoundErrorClassNotFoundException,这两种错误都非常严重。由于不同的ClassLoader会从不同的地方加载类,有时是错误的CLASSPATH引发这类错误,有时是某个库的jar包缺失引发这类错误。NoClassDefFoundErrorClassNotFoundException之间存在一些细微的不同点。

    NoClassDefFoundError表示该类在编译阶段还可以找到,但是在运行Java应用的时候找不到了,有时静态块的初始化过程会导致NoClassDefFoundError

    另外一方面,ClassNotFoundException和编译期没什么关系,当你在程序运行时利用反射加载类时((使用Class.forName())时没有找到对应的类),就可能遇到ClassNotFoundException异常,例如加载SQL驱动时,对应的类加载器找不到驱动类。除了这些基本的不同,我们可以看看别的不同,以加深对NoClassDefFoundErrorClassNotFoundException的理解。

    NoClassDefFoundError vs ClassNotFoundException

    简单来说,NoClassDefFoundErrorClassNotFoundException都是由于在CLASSPATH下找不到对应的类而引起的,通常是缺少对应的jar包,不过,JVM认为:(1)当应用运行时没有找到对应的引用,则会抛出java.lang.NoClassDefFoundError;(2)当你在代码中显式加载类(使用Class.forName())时没有找到对应的类,则会抛出java.lang.ClassNotFoundException。开发者经常遇到的情况是:ClassNotFoundException异常引起了ClassNoDefFoundError。

    1. NoClassDefFoundError是Error,是unchecked,因此也不需要使用try-catch或者finally语句块包围;另外,ClassNotFoundException是受检异常(checked Exception),因此需要使用try-catch语句块或者try-finally语句块包围,否则会导致编译错误。

    2. 如果你在J2EE开发中遇到NoClassDefFoundError,那么最有可能的原因就是存在多个类加载器和多个目标类,即我们常说的Jar包冲突——关于Jar包冲突,一般可以使用下面两种方法解决:

    • 使用Maven Helper 这个插件,可以排除掉大部分jar包冲突;
    • 根据命令mvn dependency:tree -Dverbose -Dincludes=:logback-classic
    1. 调用Class.forName()ClassLoader.findSystemClass()ClassLoader.loadClass()等方法时可能会引起java.lang.ClassNotFoundException

    2. NoClassDefFoundError是链接错误,发生在链接阶段,当解析引用的时候找不到对应的类,就会抛出java.lang.NoClassDefFoundErrorClassNotFoundException是异常,发生在运行阶段。

       
      JVM类加载阶段

    最后,这里有一页非常好的PPT,总结了这两种异常的不同点:


     
    nice slide of all differences between java.lang.NoClassDefFoundError and java.lang.ClassNotFoundException in Java


    作者:杜琪
    链接:https://www.jianshu.com/p/93d0db07d2e3
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    (Linux基础学习)第五章:Linux中的screen应用
    (Linux基础学习)第四章:Linux系统中的日期和时间介绍和ntpdate命令
    (Linux基础学习)第三章:terminal与shell的简介和修改命令提示符颜色
    (Linux基础学习)第二章:CentOS7.4安装教程
    (Linux基础学习)第一章:科普和Linux系统安装
    Linux基础入门 第一章:Linux环境搭建——Redhat 6.4图文安装教程
    结合Zabbix与Ansible打造自动化数据库监控体系
    Jenkins Tomcat 环境搭建
    SVN 服务器的搭建
    Dockerfile 创建redis容器
  • 原文地址:https://www.cnblogs.com/wxdlut/p/9103849.html
Copyright © 2011-2022 走看看