java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

 

  以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自己测试验证了一下。虽然网上说法很多,但是关于NoClassDefFoundError并没有给出一个样例,所以一直无法理解,索性自己验证了一下,收获还不少。

  ClassNotFoundException

  ClassNotFoundException这个错误,比较常见也好理解。

  原因:就是找不到指定的class。

  常见的场景就是:

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

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

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

  开发者平时会有这样一种使用方法,类似JDBC加载驱动!

 1 package test321;
2
3 public class test {
4 public static void main(String[] args) {
5 try {
6 Class.forName("test321.hello");
7 } catch (ClassNotFoundException e) {
8 e.printStackTrace();
9 }
10 }
11 }

  此时,程序会到当前的目录中寻找指定位置test321.hello这个class。

  并且这个类也是可以正常执行的。

  但是,我们修改一下加载的类名,这样显然是找不到指定的类的。

 1 package test321;
2
3 public class test {
4 public static void main(String[] args) {
5 try {
6 Class.forName("test321.hello1");
7 } catch (ClassNotFoundException e) {
8 e.printStackTrace();
9 }
10 }
11 }

  此时就会报错!

报错!
java.lang.ClassNotFoundException: test321.hello1
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at test321.test.main(test.java:6)

  原因就是找不到指定的string对应的class文件。

  NoClassDefFoundError

  这个就比较奇葩了,查找其他的资料是说,通过了编译,但是使用的时候,比如new的时候会出错。

  通过查找资料,搜集到如下的场景:

  1 类依赖的class或者jar不存在

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

  3 大小写问题,javac编译的时候是无视大小的,很有可能你编译出来的class文件就与想要的不一样!这个没有做验证。

  

  针对上面的第二点,做了个关于包名的验证:

  另一种情况就是由于你通过了编译,但是这个类是有包名的,因此在编译时需要指定classpath,在使用的时候需要加上包名才可以。

  下面做了一个小例子!

  在没有包名的情况下,我们看一下正常情况是什么样子的。

1 public class test {
2 public static void main(String[] args) {
3 System.out.println("test");
4 }
5 }

  而如果这个类中包含包名,那么按照上面的方法编译,使用时就会报错!

1 package ccc;
2
3 public class test {
4 public static void main(String[] args) {
5 System.out.println("test");
6 }
7 }

  很明显,报错信息中指出了包的信息!那么怎么办呢?

  在编译时,加上【   -d .   】这样可以把当前的目录加入到classpath中。

  在使用时,加上包名就可以了!

  也就是说,这个含有包名的类,编译时,需要指定classpath的路径,并且使用的时候指定包名全路径,才可以。

java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别的更多相关文章

  1. Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around

    1.错误描述 INFO:2015-05-01 11:12:15[localhost-startStop-1] - Root WebApplicationContext: initialization ...

  2. SpringMVC集成AOP错误:java lang classnotfoundexception org aspectj lang joinpoint

    记录自己出现的问题,Spring AOP 使用测试类测试没问题,在SpringMVC启动服务器时出现java lang classnotfoundexception org aspectj lang ...

  3. java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别

    java里生成对象有如下两种方式: 1: Object obj = new ClassName(); 直接new一个对象 2: Class clazz = Class.forName(ClassNam ...

  4. java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别(转)

    ClassNotFoundException ClassNotFoundException这个错误,比较常见也好理解. 原因:就是找不到指定的class. 常见的场景就是: 1 调用class的for ...

  5. Java基础学习(一)---Java初识

    一.Java介绍 关于Java的诞生和发展网上比较多,在此就不再赘述了,可以参考http://i.cnblogs.com/EditArticles.aspx?postid=4050233. 1.1 J ...

  6. java.lang.ClassNotFoundException: net.sf.json.JSONArray,java.lang.NoClassDefFoundError: net/sf/json/JSONArray jetty跑项目遇到的问题

    2016-05-18 15:44:25 ERROR Dispatcher.error[user:|url:]:L38 - Dispatcher initialization failed Unable ...

  7. Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]

    WARNING: Failed to register in JMX: javax.naming.NamingException: Could not load resource factory cl ...

  8. java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataProvider

    Caused by: java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/MetadataProvi ...

  9. java.lang.ClassNotFoundException: javax.persistence.EntityListeners

    Exception in thread "main" java.lang.NoClassDefFoundError: javax/persistence/EntityListene ...

随机推荐

  1. 稻壳图文模块调不出html代码

    <?php doc_article('1',20,0,0,0,266,true,true,'id',0)?> 图文调用,倒数第三个参数,官方说是是否显示html代码,但是实测是没用的,不过 ...

  2. Java Web项目中的经典代码抽取

    前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内 ...

  3. bzoj 3518 Dirichlet卷积

    详情见代码,回头再填坑... #include<iostream> #include<cstdio> #include<algorithm> #include< ...

  4. js-JavaScript高级程序设计学习笔记17

    第21章  AJAX AJAX技术的核心是XMLHttpRequest对象.可以使用XHR对象取得新数据,然后通过DOM将新数据插入到页面中.无需刷新页面即可从服务器获得数据. 1.XHR对象. 如果 ...

  5. js-JavaScript高级程序设计学习笔记9

    依然第十三章 事件 1.页面上的所有元素都支持鼠标事件,除了mouseenter和mouseleave,所有鼠标事件都会冒泡. 2.修改键:shift.ctrl.alt.meta.四个属性表示修改键的 ...

  6. 【bzoj3991】 寻宝游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3991 (题目链接) 题意 给出一个n个节点的带权树,m次操作每次修改一个关键点,求每次操作后,从其中 ...

  7. Metro-UI系统-1-tile标签

    一 效果图 二 各个效果的详解 1,简单磁贴 <div class="tile" data-role="title"> <!--定义一个磁贴- ...

  8. MongoDB安装,配置

    安装 cd /usr/local/srcwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.6.tgztar z ...

  9. STL之deque用法详解

    C++ Deque(双向队列): Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用 ...

  10. Autofac的高级使用——Autofac.2.6.3.862

    Autofac的高级使用——Autofac.2.6.3.862 目录(?)[-] 使用代码方式进行组件注册依赖服务类和组件类 使用配置文件进行组件注册不需要依赖 定义配置文件 读取config配置文件 ...