我们先来认识一下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中的说明:

  1. AnnotationFormatError - Thrown when the annotation parser attempts to read an annotation from a class file and determines that the annotation is malformed.
  2. AssertionError - Thrown to indicate that an assertion has failed.
  3. 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.
  4. VirtualMachineError - Thrown to indicate that the Java Virtual Machine is broken or has run out of resources necessary for it to continue operating.

Throwable的子类 主要分三种类别:

  1. Error -  一些严重问题导致的,大多数程序此时应该crash 而不是试图去handle的错误
  2. Unchecked Exception (aka RuntimeException) - 经常出现的编程错误比如 NullPointerException 或者非法参数. 这个Throwable类别中,程序有时可以处理该种错误 或者 从中恢复-- 或者 至少可以catch Thread的run方法,记录相应日志,并继续执行。
  3. Checked Exception (aka Everything else) -  应用程序应当能够catch这里异常,并做一些有意义的事情。

有了上述基本认识以后,我们回到正题~

在辨析两者的不同前,让我们先看看两者有什么相同点:

  1. 两者都是运行时错误,都是找不到某一个类
  2. 两者都跟java classpath有关

现在看看有什么不同:

  1. ClassNotFoundException 是在运行时由于调用 Class.forName() or ClassLoader.loadClass() or ClassLoader.findSystemClass()而找不到相应的类引起的。 NoClassDefFoundError 是由于相应的类在编译时出现,并使应用通过了编译和链接,而在运行时无法使用造成的。简单来说,前者是因为显式加载相应类失败造成的,后者是因为调用某类的方法或访问某类的域,隐式加载类失败造成的。
  2. ClassNotFoundException 是java.lang.Exception的子类,必须在源码中提供明确的处理方式(再次throw 或者 catch)。而NoClassDefFoundError 是继承自java.lang.LinkageError的Error子类。
  3. 如果你在java中用了两个ClassLoader,那么当一个ClassLoader试图去访问另一个ClassLoader加载的类时,jvm会抛出ClassNotFoundException。

可能造成 NoClassDefFoundError 的原因有很多:

  1. 最常见的就是Class 在java classpath 中找不到。(可以通过打印字符串System.getProperty("java.class.path")来查看当前jvm使用的classpath)
  2. 你可能使用的是jar命令在运行程序,而class在manifest文件的Class Path 属性中没定义
  3. 启动脚本override了环境变量ClassPath
  4. 也可能是一个类依赖的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的更多相关文章

  1. 【转】NoClassDefFoundError和ClassNotFoundException

    调试Hadoop源码时,一运行就报这个错误,后来发现是maven配置时,scope配置的问题, MAVEN Scope使用  相关链接:http://acooly.iteye.com/blog/178 ...

  2. 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别

    (上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸) ___ 概述 Hello,大家好,我们又来讲面试中的基础题了,今天这是一道很经典又很猥琐的题 说猥琐是 ...

  3. JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException

    我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...

  4. 关于NoClassDefFoundError和ClassNotFoundException异常

    java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 都是 Java 语言定义的标准异常.从异常类的名称看似乎都跟类的定义 ...

  5. NoClassDefFoundError与ClassNotFoundException

    原文地址: https://blog.csdn.net/jamesjxin/article/details/46606307 怎么解决NoClassDefFoundError错误 NoClassDef ...

  6. NoClassDefFoundError与ClassNOtFoundException的区别

    NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该 ...

  7. 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: ...

  8. java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;

    如果你出现类似如下错误 1. Install tomcat7 in my home directory and set up `CATALINA_HOME` environment variable ...

  9. 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制

    转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...

随机推荐

  1. find

    语法:find [路径] [参数] [action] -name filename,查找名为filename的文件 -iname filename,查找名为filename的文件,但是不区分大小写 - ...

  2. 不懂前端的程序员不是好美工——UI框架metronic使用教程——程序员视角

    本着不懂前端的程序员不是好美工的观点,所以作为一个仅懂一点前端的程序员,为了成为一个好美工,所以只能用些取巧的方法伪装一下. metronic一个基于bootstrap的响应式的后台管理平台的UI框架 ...

  3. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  4. POJ1962Corporative Network[带权并查集]

    Corporative Network Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 3945   Accepted: 14 ...

  5. AC日记——I Hate It 洛谷 P1531

    题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...

  6. selenium自动化-java-封装断言

    封装的断言. 1 package com.baidu.www; import org.testng.Assert; /* * 封装断言 */ public class assertion { stat ...

  7. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 访问频率限制功能实现、防止黑客扫描、防止恶意刷屏

    很多软件组件,大家都能想到了,大家也能做出来,但是成熟稳定.可靠.易用.功能全面,可信任,可相信,可开源就不是很容易,需要树立良好的口碑才可以. 1:往往会有黑客,进行撞库挖掘漏洞,很多系统的账户有可 ...

  8. Learning Roadmap of Robotic Operating System (ROS)

    ROS Wiki: http://wiki.ros.org/ Robots Using ROS Textbooks: A Gentle Introduction to ROS Learning ROS ...

  9. p2p网贷系统即将上线

    等有时间了,我将此项目的详细设计与开发流程进行陈述,想学习的朋友敬请期待 先上界面:首页 后台:

  10. 86 ipmitools-查看硬件信息工具

    1.简介 IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备"智能化"的新一代通用接口标准.用户可以利 ...