ClassNotFoundException和NoClassDefFoundError的区别

jvm加载类过程:

           

 

                 加载:加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一定                              非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成                            (比如将JSP文件转换成对应的Class类)。

                 验证:确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

                 准备:准备阶段是正式为类变量分配内存(方法区)并设置类变量的初始值阶段,仅设初始值,若为final修饰则赋用户指定的值

                 解析:虚拟机将常量池中的符号引用替换为直接引用的过程

                 初始化:真正执行类中定义的Java程序代码    

                                           

  ClassNotFoundException:就是找不到指定的class。                                    

                                               调用class的forName方法时,找不到指定的类

                                             ClassLoader 中的 findSystemClass() 方法时,找不到指定的类

                                             ClassLoader 中的 loadClass() 方法时,找不到指定的类

  NoClassDefFoundError:发生在初始化阶段

                                              类依赖的class或者jar不存在

                                         类文件存在,但是存在不同的域中

                                              使用spring框架,注入时若该类不存在则会报NoClassDefFoundError

                            

posted @ 2018-06-22 10:46  miss小张  阅读(161)  评论(0编辑  收藏  举报