ClassNotFoundException和NoClassDefFoundError的区别

1. ClassNotFoundException

当应用尝试在类路径中用全限量名去加载某个类时,如果找你不到它的定义就会报CLassNotFoundException 。它是一个可检测异常。

通常出现在用Class.forName(), ClassLoader.loadClass()或 ClassLoader.findSystemClass()这三个方法加载类的时候。我们在使用反射的时候,要特别注意这个异常。

产生原因:

Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。

要解决这个问题很容易,唯一需要做的就是要确保所需的类连同它依赖的包存在于类路径中。当Class.forName被调用的时候,类加载器会查找
类路径中的类,如果找到了那么这个类就会被成功加载,如果没找到,那么就会抛出ClassNotFountException,除了
Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass在动态加载类到内存
中的时候也可能会抛出这个异常。

另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。

由于类的动态加载在某种程度上是被开发者所控制的,所以他可以选择catch这个异常然后采取相应的补救措施。有些程序可能希望忽略这个异常而采取其他方法。还有一些程序则会终止程序然后让用户再次尝试前做点事情。

解决方法:

 1. 首先检查一下环境变量classpath的配置,看一看所需要的支持类库是否放在类路径里面。

 2. 是否使用了重复的类库,且版本不一致,导致低版本被优先使用。

 3. 类名错了,在调用class类中的forname方法时会出异常,很明显,我的是在调用classloader的loadclass方法时出错。

 4. 没有导入纯Java驱动包。

 还有一些初级错误比如:

 5. 清单配置文件中是否activity的路径错误,activity名字是否错误。

 6. 不要使用中文作为项目名称,如果你想修改APP的名称可以在string.xml以Androidmanifest.xml文件中修改。

2. NoClassDefFoundError

NoClassDefFoundError是一种致命错误。

当JVM尝试通过new关键字创建一个类实例或者方法调用来加载一个类时找不到这个类的定义就会出现这个错误。

通常是编译时正常编译,但是运行时找不到这个类。

通常发生在执行动态代码块或者初始化静态字段时报了异常,从而导致类初始化失败而引发NoClassDefFoundError。

产生原因:maven 项目中出现这种错 可能是缺少依赖jar包 也可能是打包错误 编译没将这个类编译 可以去maven仓库 删掉重新编译 maven install 又是maven clean 是清不干净的。

如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个错误往往是你使用new操作符来创建一个新的对象但却找不到该对象对应的类。这个时候就会导致NoClassDefFoundError。

由于NoClassDefFoundError是有JVM引起的,所以不应该尝试捕捉这个错误。

解决办法:查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值