二者的原因的都是jvm在类加载路径下找不到对应的类
NoClassDefFoundError是Error异常类型是Throwable,而ClassNotFoundException是Exception
NoClassDefFoundError往往不涉及编译问题,在编译器一般可以通过,而在运行期JVM找不到类的时候会出现
ClassNotFoundException是编译器检查异常,往往在编译器就有可能出现,也可以选择try-catch
说到二者的根本区别就要涉及java的类加载机制,在java中虚拟机装载一个类分为显示和隐式
所谓显示类加载如常用的Class.forName(),new ClassLoader()..loadClass(),当使用指定的类字符串来调用这些方法的时候
就是显示的类加载,当指定的类路径和名称发生变化时就会出现ClassNotFoundException
而 类装入发生在由于引用、实例化或继承导致装入类的时候(不是通过显式方法调用)。在每种情况下,装入都是在幕后启动的,JVM 会解析必要的引用并装入类。与显式类装入一样,如果类已经装入了,那么只是返回一个引用;否则,装入器会通过委托模型装入类。
而NoClassDefFoundError往往是发生在隐式类加载的时候