文档章节

java.lang.ClassNotFoundException与java.lang.NoClass

M
 MackCC_Sun
发布于 2015/07/15 09:57
字数 824
阅读 5
收藏 0


  以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自己测试验证了一下。虽然网上说法很多,但是关于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的路径,并且使用的时候指定包名全路径,才可以。

 

  参考资料

  1 http://blog.csdn.net/magister_feng/article/details/7459151

  2 http://www.blogjava.net/leekiang/archive/2007/04/26/113810.html

  3 http://blog.sina.com.cn/s/blog_65c50719010

本文转载自:

M
粉丝 4
博文 158
码字总数 29095
作品 0
朝阳
技术主管
私信 提问
spring的所有注解都报类找不到

java.lang.ClassNotFoundException: Service java.lang.ClassNotFoundException: Repository java.lang.ClassNotFoundException: RequestMapping 都引入了。。...

奔跑的小菜鸟
2016/06/01
0
0
spring的所有注解都报类找不到

java.lang.ClassNotFoundException: Service java.lang.ClassNotFoundException: Repository java.lang.ClassNotFoundException: RequestMapping 都引入了。。...

奔跑的小菜鸟
2016/06/01
0
0
ibatis parameterClass是2个参数类型时!!

错误信息: Exception in thread "main" java.lang.RuntimeException: Error occurred. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeExcep......

小乞丐
2015/01/03
3K
3
spring的所有注解都报类找不到

java.lang.ClassNotFoundException: Service java.lang.ClassNotFoundException: Repository java.lang.ClassNotFoundException: RequestMapping 都引入了。。...

奔跑的小菜鸟
2016/06/01
5
0
spring单元测试启动报错

这是我自己练习的一个项目,我看了日志,以为是配置文件路径不对,可是换了几种方法试了也不行。包括百度的方法! 代码如下: 报错信息如下: 警告: Exception encountered during context ...

酸奶瓶盖儿
2017/05/08
580
4

没有更多内容

加载失败,请刷新页面

加载更多

RS-232、RS422和RS-485的区别和各自的实现方式

一、殊途同归 RS-232、RS422和RS-485 均属于UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),仅用两根信号线(Rx 和Tx)就可以完成通信过程; 而由于各自使用的电...

rainbowcode
31分钟前
0
0
spring 本类中方法调用另外一个方法事务不生效

1、在spring配置文件中添加 <aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true" />声明自动代理 <!-- 标识通过aop框架暴露该代理,aopContext能够访问. --> proxy-targe......

重城重楼
36分钟前
5
0
项目 banner 乱弹

------------------------------------------ 村上春树 ------------------------------------- 如果我爱你,而你也正巧爱我,你头发乱了的时候,我会笑笑地替你拨一拨,然后手还留恋地在你...

宿小帅
48分钟前
3
0
PHP获取未来七天的日期和星期

php获取未来七天的日期和星期代码 第一步:获取需要天数的日期,然后调用函数 //获取未来七天的日期 for($i=1;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(d...

一只懒猫-
今天
2
0
总结:IO模型

分类 多路复用 参考文章: https://www.jianshu.com/p/6a6845464770 https://www.cnblogs.com/zingp/p/6863170.html https://blog.csdn.net/sehanlingfeng/article/details/78920423......

浮躁的码农
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部