ClassNotFoundException和NoClassDefFoundError的差别
正如它们的名字所说明的:NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中错误和异常是有差别的,我们能够从异常中恢复程序但却不应该尝试从错误中恢复程序。
ClassNotFoundException的产生原因:
Java支持使用Class.forName方法来动态地载入类。随意一个类的类名假设被作为參数传递给这种方法都将导致该类被载入到JVM内存中。假设这个类在类路径中没有被找到,那么此时就会在执行时抛出ClassNotFoundException异常。
要解决问题非常easy,唯一须要做的就是要确保所需的类连同它依赖的包存在于类路径中。当Class.forName被调用的时候。类载入器会查找类路径中的类,假设找到了那么这个类就会被成功载入,假设没找到。那么就会抛出ClassNotFountException。
除了Class.forName,还有例如以下情况
- ClassLoader.loadClass、
- ClassLOader.findSystemClass
在动态载入类到内存中的时候也可能会抛出这个异常。
另外另一个导致ClassNotFoundException的原因就是:当一个类已经某个类载入器载入到内存中了。此时另一个类载入器又尝试着动态地从同一个包中载入这个类。
因为类的动态载入在某种程度上是被开发人员所控制的,所以他能够选择catch这个异常然后採取对应的补救措施。有些程序可能希望忽略这个异常而採取其它方法。
另一些程序则会终止程序然后让用户再次尝试前做点事情。
NoClassDefFoundError产生的原因:
在类的主动使用中。假设JVM或者ClassLoader实例尝试载入类的时候却找不到类的定义。
要查找的类在编译的时候是存在的,执行的时候却找不到了。
因为NoClassDefFoundError是有JVM引起的。所以不应该尝试捕捉这个错误。
解决问题的办法就是:查找那些在开发期间存在于类路径下但在执行期间却不在类路径下的类。
另:
ClassNotFoundException 发生在类的载入(装入)阶段。
类的载入
载入.class文件的方式
- 从本地系统中直接载入
- 通过网络下载.class文件
- 从zip,jar等归纳文件里载入.class文件
- 从专有数据库中提取.class文件
- 将java源文件动态编译为.class文件
当应用程序试图通过类的字符串名称,使用常规的【三种方法】装入类。但却找不到指定名称的类定义时就抛出该异常。
NoClassDefFoundError 发生在类的初始化阶段 ,那什么情况下会导致类的初始化呢?
主动使用(六种)
- 创建类的实例
- 訪问某个类或接口的静态变量,或者对该静态变量赋值
- 调用类的静态方法
- 反射(如Class.forName("com.lang.String")
- 初始化一个类的子类
- Java虚拟机启动时被标为启动类的类
当眼下执行的类已经编译。可是找不到它的定义时,也就是说你假设编译了一个类B。在类A中调用,编译完毕以后,你又删除掉B,执行A(类的主动使用)的时候那么就会出现这个错误,另外能够发现NoClassDefFoundError 的产生也伴随着ClassNotFoundException,这也非常好解释。类的初始化。肯定要先进行类载入和类连接两步的。总结就是例如以下:
- 载入时从外存储器找不到须要的class就出现ClassNotFoundException
- 初始化时从内存找不到须要的class就出现NoClassDefFoundError
附:
NoClassDefFoundError 解决的三种方法:
1. Simple example of NoClassDefFoundError is class belongs to a jar and jar was not added into classpath or sometime
jar’s name has been changed by someone like in my case one of my colleague has changed tibco.jar into tibco_v3.jar and
by program is failing with java.lang.NoClassDefFoundError and I was wondering what’s wrong.
首先是类在执行的时候依赖于其他的一个jar包。可是该jar包没有载入到classpath中或者是该jar包的名字被其他人改了,就像我的一个样例tibo.jar改为了tibco_v3.jar…….
2. Class is not in Classpath, there is no sure shot way of knowing it but many a times you can just have a look to print
System.getproperty(”java.classpath“)and it will print the classpath from there you can at least get an idea of your actual
runtime classpath.
执行的类不在classpath中。这个问题没有一个确定的方法去知道。可是非常多时候你能够通过System.getproperty(”java.classpath“)方法,该方法能让你至少能够领略到实际存在的执行期间的classpath。
3. Just try to run with explicitly -classpath option with the classpath you think will work and if its working then it’s
sure short sign that some one is overriding java classpath.
试着通过-classpath命令明白指出你觉得正确的classpath。假设可以正常运行的话就说明你使用的classpath是正确的,而系统中的classpath已经被修该过了。
ClassNotFoundException和NoClassDefFoundError的差别的更多相关文章
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- 【Java】理解ClassNotFoundException与NoClassDefFoundError的区别
一.概念上的认识 1)Exception与Error的区别 1.Exception的出现不会导致程序结束,用户程序可以捕获该异常 2.Error的出现会导致程序结束,用户程序无法捕获Error错误 2 ...
- ClassNotFoundException和NoClassDefFoundError的区别
ClassNotFoundException ClassNotFoundException的产生原因:就是找不到指定的class. ClassNotFoundException发生在加载阶段. 常见的 ...
- ClassNotFoundException与NoClassDefFoundError异常
方法 loadClass()抛出的是 java.lang.ClassNotFoundException异常(一般是jar冲突或者没有引入jar):方法 defineClass()抛出的是 java.l ...
- ClassNotFoundException和NoClassDefFoundError的解决办法
程序在其他手机都没有问题,但在刷到版本稍微较低的平板或手机上时就会直接闪退,并报出以下异常: java.lang.RuntimeException: Unable to instantiate act ...
- ClassNotFoundException和 NoClassDefFoundError的区别
##### 1. 类型 ClassNotFoundException继承自Exception,属于java异常类.NoClassDefFoundError继承自Error,在java中Error一般属 ...
- ClassNotFoundException和 NoClassDefFoundError区别验证
首先NoClassDefFoundError是一个错误,而ClassNotFoundException是一个异常 NoClassDefFoundError产生的原因: 如果JVM或者Classload ...
- Android 升级ADT到22第三方Jar包导致的ClassNotFoundException和NoClassDefFoundError异常解决
在使用异步载入框架Android-Universal-Image-Loader的Jar包的时候遇到错误: java.lang.NoClassDefFoundError:com.nostra13.uni ...
- NoClassDefFoundError vs ClassNotFoundException
我们先来认识一下Error 和Exception, 两个都是Throwable类的直接子类. Javadoc 很好的说明了Error类: An Error is a subclass of Thro ...
随机推荐
- tflearn Training Step每次 We will run it for 10 epochs (the network will see all data 10 times) with a batch size of 16. n_epoch=10, batch_size=16
Training TFLearn provides a model wrapper 'DNN' that can automatically performs a neural network cla ...
- exchange 2010-备份还原
操作系统:Windows Server 2008R2 \ Exchange2010 测试 1.使用Administraotr用户进行查看己有邮件,如下图: 2.备份Exchange2010整个数据库, ...
- [JavaEE] Apache Maven 入门篇(上)
http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html 作 ...
- hihoCoder-1830 2018亚洲区预选赛北京赛站网络赛 C.Cheat 模拟
题面 题意:4个人围一圈坐着,每个人13张牌,然后从第一个人开始,必须按照A-K的顺序出牌,一个人出牌后,剩下的人依次可以选择是否质疑他,例如,第一个人现在必须出8(因为按照A-K顺序轮到了),可是他 ...
- 关于ssh加密方式的理解
最近公司服务器被挖矿,所以更换了ssh的连接方式,从之前的密码登陆更换为密钥登陆方式,且禁止了密码登陆.所以在配置这个密钥的过程中,顺带了解了些ssh的原理和相关知识.通用的开源 1.ssh是什么,为 ...
- B - Even Odds
Problem description Being a nonconformist, Volodya is displeased with the current state of things, p ...
- guice基本使用,三种注入方式(二)
guice提供了强大的注入方式. 1.属性注入 2.构造器注入 3.set方式注入 1.属性注入: package com.ming.user.test; import com.google.inje ...
- 每条sql语句实际上都是一个事物(事物多种类型解读)
事务(数据库引擎) 事务是作为单个逻辑工作单元执行的一系列操作.一个逻辑工作单元必须有四个属性,称为原子性.一致性.隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务.原子性事务必须是原子工 ...
- NFine平台去掉平台介绍页面出现的一系列问题
1.去掉平台介绍页面要做的操作:数值Index页面的下面两处内容 2.注释掉以上两处内容后出现的问题:•当打开多个页面后,最先打开的第一个页面(如下图1的位置)点击×号不能关闭页面:•当打开多个页面后 ...
- 对比JavaScript的入口函数和jQuery的入口函数
JavaScript的入口函数要等到页面中所有的资源(包括图片.文件)加载完成才开始执行. jQuery的入口函数只会等待文档数加载完成就开始执行,并不会等待图片.文件的加载.