java.lang.NoClassDefFoundError: javax/mail/AuthenticatorNoClassDefFoundError vs ClassNotFoundException2者有什么区别?
什么时候会出现NoClassDefFoundError ?

解决方案 »

  1.   

    当 Java 虚拟机或 ClassLoader 实例试图在类的定义中加载(作为通常方法调用的一部分或者作为使用 new 表达式创建的新实例的一部分),但无法找到该类的定义时,抛出此异常。 当前执行的类被编译时,所搜索的类定义存在,但无法再找到该定义。 ------------
    当应用程序试图使用以下方法通过字符串名加载类时,抛出该异常: Class 类中的 forName 方法。 
    ClassLoader 类中的 findSystemClass 方法。 
    ClassLoader 类中的 loadClass 方法。 
    但是没有找到具有指定名称的类的定义。 
    -------------------------------------------------------------------------------------------------------
    以上信息来自JDK DOCNoClassDefFoundError  当编译类的时候,在JVM中形成类表,那么就会有这样的错误。那个表就像编译二维表,当jar的类加载到JVM中时候就形成了。只是一个名称映射,但是真正需要的时候才加载类。这个类的class--不能满足JVM那个编译二维表----so---------------------------------------------------------------------------------------------------------
    NoClassDefFoundError  ---有身份证,但是不是真的。ClassNotFoundException----压根就没有身份证。
      

  2.   

    前者是类编译时抛出的异常
    后者是类加载时抛出的异常
    当jdk路径配置错误事,对类编译时会产生NoClassDefFoundError
    例如使用数据库时,加载类class.forName("com.mysql.jdbc.Driver")时,找不到所需的类时,就会抛出ClassNotFoundException