java ClassNotFoundException和NoClassDefFoundException的差别

首先从名字上可以看出一类是异常,一类属于错误。异常可以通过异常处理机制使程序继续运行,但出现错误必然找出程序崩溃。

       这个问题是和java 类的加载相关的。类加载的时候先要把编译好的类文件(.class ,jar包等)加载JVM管理的方法区当中,这个过程叫做加载,如果这个过程中没找类文件就会出现ClassNotFoundException。如果加载成功之后,会有一个该类的类对象(class对象)。想方法类,就通过这个类对象,当在内存当中没有找到这个类对象,就会出现NotClassDefFoundError。

1.ClassNotFoundException:

这类异常出现在对类进行加载时,该路径下找不到对应的class文件。有以下情况:

    1.通过Class.forName()加载类。

    2.通过类加载器ClassLoader加载loadClass(),或者findSystemClass()。

如下代码:
[java] view plain copy
在CODE上查看代码片派生到我的代码片

    package abs; 

[java] view plain copy
在CODE上查看代码片派生到我的代码片

    public class Main { 
     
        public static void main(String arg[]) throws Exception { 
            Class.forName("Main"); 
        } 
    } 

就会出现:

Exception in thread "main" java.lang.ClassNotFoundException: Main
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)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at abs.Main.main(Main.java:18)

这是因为在加载类的时候找不到Mian.class文件(在使用forName()加载类时需要加上包名)。将加载类的代码改成Class.forName("abs.Main")就不会发生异常了。

2.NotClassDefFoundError:

         这类错误发生在运行时,通常是编译通过,但当运行时使用new参数该类对象时,找不到类的定义造成,此异常通常是由于一个类中引用了另外的一个类,而被引用的类没有被classLoader找到。如在编译好Person类后删除person.class时再运行。

[java] view plain copy
在CODE上查看代码片派生到我的代码片

    public class Main { 
     
        public static void main(String arg[]) throws Exception { 
            Person p=new Person("xjp",20); 
            System.out.println(p.getName()); 
        } 
    } 

就会出现

  Exception in thread "main" java.lang.NoClassDefFoundError: abs/Person

猜你喜欢

转载自haidaoqi3630.iteye.com/blog/2318055