NoClassDefFoundError vs ClassNotFoundException
我们先来认识一下Error 和Exception, 两个都是Throwable类的直接子类。 Javadoc 很好的说明了Error类:
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions.
抛出Error时,程序就是出现了严重的错误,程序会立即终止运行。我们来看一下Error的一些子类和它们在javadoc中的说明:
AnnotationFormatError- Thrown when the annotation parser attempts to read an annotation from a class file and determines that the annotation is malformed.AssertionError- Thrown to indicate that an assertion has failed.LinkageError- Subclasses of LinkageError indicate that a class has some dependency on another class; however, the latter class has incompatibly changed after the compilation of the former class.VirtualMachineError- Thrown to indicate that the Java Virtual Machine is broken or has run out of resources necessary for it to continue operating.
Throwable的子类 主要分三种类别:
Error- 一些严重问题导致的,大多数程序此时应该crash 而不是试图去handle的错误- Unchecked Exception (aka
RuntimeException) - 经常出现的编程错误比如NullPointerException或者非法参数. 这个Throwable类别中,程序有时可以处理该种错误 或者 从中恢复-- 或者 至少可以catch Thread的run方法,记录相应日志,并继续执行。 - Checked Exception (aka Everything else) - 应用程序应当能够catch这里异常,并做一些有意义的事情。
有了上述基本认识以后,我们回到正题~
在辨析两者的不同前,让我们先看看两者有什么相同点:
- 两者都是运行时错误,都是找不到某一个类
- 两者都跟java classpath有关
现在看看有什么不同:
- ClassNotFoundException 是在运行时由于调用 Class.forName() or ClassLoader.loadClass() or ClassLoader.findSystemClass()而找不到相应的类引起的。 NoClassDefFoundError 是由于相应的类在编译时出现,并使应用通过了编译和链接,而在运行时无法使用造成的。简单来说,前者是因为显式加载相应类失败造成的,后者是因为调用某类的方法或访问某类的域,隐式加载类失败造成的。
- ClassNotFoundException 是java.lang.Exception的子类,必须在源码中提供明确的处理方式(再次throw 或者 catch)。而NoClassDefFoundError 是继承自java.lang.LinkageError的Error子类。
- 如果你在java中用了两个ClassLoader,那么当一个ClassLoader试图去访问另一个ClassLoader加载的类时,jvm会抛出ClassNotFoundException。
可能造成 NoClassDefFoundError 的原因有很多:
- 最常见的就是Class 在java classpath 中找不到。(可以通过打印字符串System.getProperty("java.class.path")来查看当前jvm使用的classpath)
- 你可能使用的是jar命令在运行程序,而class在manifest文件的Class Path 属性中没定义
- 启动脚本override了环境变量ClassPath
- 也可能是一个类依赖的native library不可用
举个我自己的栗子:
#!/bin/bash BIN_DIR=../MatchSnapshots/bin export JAVA_HOME=/usr/lib/jvm/java--openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH java -cp $BIN_DIR:$JAVA_HOME/lib/tools.jar\
edu.umd.MatchSnapshots.Main \
some other options
源码是使用了com.sun.tools.hat.internal.parser.Reader类,在Eclipse中buildpath里添加了tools.jar以后编译通过并可以运行。在command line下,却抛出了NoClassDefFoundError,使用-cp选项添加了tools.jar就没这个问题了。
参考文章:
Difference between ClassNotFoundException vs NoClassDefFoundError in Java
How to resolve java.lang.ClassNotFoundException in Java
Differences betweeen Exception and Error
NoClassDefFoundError vs ClassNotFoundException的更多相关文章
- 【转】NoClassDefFoundError和ClassNotFoundException
调试Hadoop源码时,一运行就报这个错误,后来发现是maven配置时,scope配置的问题, MAVEN Scope使用 相关链接:http://acooly.iteye.com/blog/178 ...
- 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别
(上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸) ___ 概述 Hello,大家好,我们又来讲面试中的基础题了,今天这是一道很经典又很猥琐的题 说猥琐是 ...
- JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException
我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...
- 关于NoClassDefFoundError和ClassNotFoundException异常
java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 都是 Java 语言定义的标准异常.从异常类的名称看似乎都跟类的定义 ...
- NoClassDefFoundError与ClassNotFoundException
原文地址: https://blog.csdn.net/jamesjxin/article/details/46606307 怎么解决NoClassDefFoundError错误 NoClassDef ...
- NoClassDefFoundError与ClassNOtFoundException的区别
NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该 ...
- adobe air ane 中有的java class 打包 apk 后却没有了报NoClassDefFoundError ,ClassNotFoundException
apache flex sdk 手机项目 09-18 10:34:55.030: E/AndroidRuntime(19513): FATAL EXCEPTION: main 09-18 10:34: ...
- java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;
如果你出现类似如下错误 1. Install tomcat7 in my home directory and set up `CATALINA_HOME` environment variable ...
- 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制
转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...
随机推荐
- RabbitMQ服务安装配置
RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.RabbitMQ据说具有良 ...
- win7+ubuntu双系统 重装win7后grub修复
问题:之前安装的是win7+ubuntu双系统,重装win7后启动选项没有了,直接进入的是win7系统,无法进入ubuntu系统了. 解决办法:我们需要修复grub,将ubuntu系统重新挂载一下,具 ...
- FineReport实现根据点击次数奇偶性排序的方法
使用FineReport报表软在进行排序的时,很多时候您可能想实现根据点击的次数进行升降序排序,也就是说点击第一次点击标题升序排序,再次点击就降序,以此类推,而不是通过选择升序进行升序排列,选择降序进 ...
- thinkphp
U方法: 模板导入后,先在浏览器执行index.php文件,当出现下图时,框架中的内容才可以出现. 增加admin后台文件夹: 连接数据库:可以使用pdo的方式连接
- 上海闪酷成为京东商城第一批独立软件开发商(ISV)
闪酷信息技术(上海)有限公司一直致力于为品牌企业提供电子商务软件及其服务,为其拓展电商渠道保驾护航.上海闪酷依据多年的行业经验和技术积累,与中国 最大的B2C商城达成战略合作,为其2万多家品牌供应商提 ...
- bzoj 1296: [SCOI2009]粉刷匠
Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...
- 优才网Go名库讲解全套教程
教程内容:04-macaron03-goconvey02-xorm01-goconfig00-introduction 下载地址:http://www.fu83.cn/thread-322-1-1.h ...
- RCW 生存期控制
RCW是.net 对com的包装,比如office就是通过RCW来被.net调用的.可以百度:office pia 了解更多信息. RCW 是一个.net类. 1.关闭线程对rcw的自动清理 Syst ...
- C# 对 App.config的appSettings节点数据进行加密
.NET平台下的Winform和Asp.net的配置文件默认都是明文保存的,本文使用的是.Net自身如何加密配置文件,不包含自定义的加密规则 但.Net是提供了直接对配置文件加密的功能的,使用.Net ...
- Cache,MemCache,Application,Cookie等其它缓存汇总
为了提高网页运行速度我们用到了各种缓存技术,今天就来汇总下,相信聪明的你也一定会有所收获的o(^▽^)o 1.Cache(PS:看见一个博客介绍的不错,我就直接Copy了) Cache 即高速缓存.那 ...