NoClassDefFoundError & ClassNotFoundException

从字面上来看就是一个是错误一个是异常。以下是JDK文档中的解释。
 1)
 public class ClassNotFoundExceptionextends Exception
  Thrown when an application tries to load in a class through its string name using:
   * The forName method in class Class.
   * The findSystemClass method in class ClassLoader .
   * The loadClass method in class ClassLoader.
  but no definition for the class with the specified name could be found.

  As of release 1.4, this exception has been retrofitted to conform to the general purpose exception-chaining mechanism.
  The "optional exception that was raised while loading the class" that may be provided at construction time and accessed
  via the getException() method is now known as the cause,
  and may be accessed via the Throwable.getCause() method, as well as the aforementioned "legacy method."
  

 2)
 public class NoClassDefFoundError extends LinkageError

 Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class
 (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

 The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.
 
 首先两个意思都是编译通过,但是运行的时候找不到类定义(class)
 ClassNotFoundException
  当应用程序以 字符串(类名称) 方式调装载一个类时,而该类的定义(class)无法找到,该异常被抛出,有以下几种情况:
  * Class的forName方法
  * ClassLoader中的findSystemClass方法
  * ClassLoader中的loadClass方法
  为了遵循通用的异常链机制,从JDK1.4起,这个异常已经被改造。当构造新对象时可以作为可选异常,并且可以通过getException()方法来获取原因
 
 NoClassDefFoundError
 当虚拟机或者ClassLoader尝试装载一个类的定义(该类是作为方法的一部分调用或者是使用new表达式来创建新实例的一部分),但是又无法找到该类定义时抛出

 实例代码 
public class Main{
 //作为方法一部分调用
 public static void trigger(){
  try{
    ThirdPart.name = "edwin";
    System.out.println(ThirdPart.name);   
   }catch(Exception e){
    e.printStackTrace();
   } 
 }
 //作为构造器(new)的一部分
 public Main(){
  trigger();
 }

 public static void main(String[] args){
 // 1) trigger();
 // 2) Main main = new Main();
 }
}

public class ThirdPart{
 public static String name;
}


public class Main2{
 
 public static void main(String[] args) {
  System.out.print("Hello/t");
  try{
   Class clazz = Class.forName("ThirdPart");
   ThirdPart third = (ThirdPart)clazz.newInstance();
   third.name = "edwin";
   System.out.println(third.name);  
  }catch(ClassNotFoundException e){
   Throwable t1 = e.getCause();
   System.out.println(t1);  
   Throwable t2 = e.getException();
   System.out.println(t2);  
  }catch(InstantiationException e){
   e.printStackTrace();
  }catch(IllegalAccessException e){
   e.printStackTrace();
  }

 }
}

Exception in thread "main" java.lang.NoClassDefFoundError: ThirdPart
        at Main.main(Main.java:5)
Caused by: java.lang.ClassNotFoundException: ThirdPart
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)  
  
Exception in thread "main" java.lang.ClassNotFoundException: ThirdPart
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at Main2.main(Main2.java:5)
 
 从异常栈可以看出,在这种情况下,NoClassDefFoundError是对ClassNotFoundException进行的包装
 还有一个区别就是Error是不能被捕获的,这应该是JDK的设计机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值