`

difference between NoClassDefFoundError&ClassNotFoundException

阅读更多

最明显的区别:

The difference between the two is that one is an Error and the other is an Exception .

 

ClassNotFoundException一般在ClassLoader去加载的时候如果找不到,直接在加载器里面就跑出了异常,注意是在loader里面抛出来的

NoClassDefFoundError一般是用户类A类引用了自己公司开发的某个框架类B类(B类一般会在jar包里面),而B类里面一般情况会引用第三方著名的jar包,比如commons-log.jar等等,如果你只把包含B类的jar包放入了web-inf/lib,而第三方的commons-log.jar没用放入,虽然编译时成功了,没用问题,可是运行的时候解析B类的时候,B类依赖于C类,而C类找不到,就会抱这个错误

 

举一个最容易理解的例子

 

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Class c = Class.forName("com.mycompany.framework.VeryStrong");
            System.out.println(c);
        }
    }
 


   
    上面是用户的Class,依赖的com.mycompany.framework.VeryStrong作为jar包放入web-inf/lib下面和classpath下面,编译没问题,一切正常
   
    不幸的是,com.mycompany.framework.VeryStrong中声明了一个变量叫public static final Logger log = Logger.getLogger(VeryStrong.class);


    在用户servlet被访问的时候,异常抛了出来
   
    这个异常是在VeryStrong中抛出的,因为加载他的时候引用的类没用找到,所以抛出
    java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        com.mycompany.framework.VeryStrong.<clinit>(VeryStrong.java:36)
        java.lang.Class.forName0(Native Method)
        java.lang.Class.forName(Unknown Source)
        com.ht.xu.HelloWorldServlet2.doGet(HelloWorldServlet2.java:30)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

 
    这个类是在java.net.URLClassLoader类抛出的,因为去load的时候没用找到
    java.lang.ClassNotFoundException: org.apache.log4j.Logger
        java.net.URLClassLoader$1.run(Unknown Source)
        java.security.AccessController.doPrivileged(Native Method)
        java.net.URLClassLoader.findClass(Unknown Source)
        java.lang.ClassLoader.loadClass(Unknown Source)
        java.lang.ClassLoader.loadClass(Unknown Source)
        com.mycompany.framework.VeryStrong.<clinit>(VeryStrong.java:36)
        java.lang.Class.forName0(Native Method)
        java.lang.Class.forName(Unknown Source)
        com.ht.xu.HelloWorldServlet2.doGet(HelloWorldServlet2.java:30)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics