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 ...
随机推荐
- EF6 DataMigration 从入门到进阶
引言 在EntityFramework的开发过程中我们有时因需求变化或者数据结构设计的变化经常会改动表结构.但数据库Schema发生变化时EF会要求我们做DataMigration 和UpdateDa ...
- AngularJS笔记---注册服务
在前面的笔记中,了解到AngularJS的后台控制可以在Controller里面实现. 可是如果所有的逻辑代码都写到Controller会显得该Controller过于臃肿. 不方便维护, Angul ...
- JS入门学习,写一个时钟~
<!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <t ...
- 修改VMware虚拟机里面的显卡名称
修改VMware虚拟机里面的显卡名称 现在有些蛋疼坑爹的游戏,会检测显卡的名称,如果其中有“Vmware”这类的字眼,就会提示程序在虚拟机中运行而拒绝执行(太不科学了嘛,我要是把我的实机驱动名称也改成 ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for
apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for 在RedHat Linux 5 与 CentOS 5服务器上配置好apache后,启动或 ...
- HTML5入门(CSS样式-------------------(CSS基础知识点----------------------------))
CSS继承性+层叠性+盒子+浮动 一.CSS继承性 eg: <style> div{ ...
- LeetCode "448. Find All Numbers Disappeared in an Array"
My first reaction is to have an unlimited length of bit-array, to mark existence. But if no extra me ...
- jS字符串大小写转换实现方式
toLocaleUpperCase 方法:将字符转换为大写 stringVar.tolocaleUpperCase( ) 必选的 stringVar 引用是一个 String 对象,值或文字. //转 ...
- .Net开源微型ORM框架测评
什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间 ...