java ClassNotFoundException和NoClassDefFoundException的差别

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

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

1.ClassNotFoundException:

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

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

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

如下代码:

package abs;
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时再运行。

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


你可能感兴趣的:(JAVA)