NoClassDefDoundError与ClassNotFoundException整理笔记

xiaoxiao2021-02-28  50

ClassNotFoundException与NoClassDefDoundError

前言:

工作中,偶尔会遇到NoClassDefDoundErr与ClassNotFoundException的问题,由于各种原因,并没有进行深入研究,问题解决了也就放过了,今天又遇到这个问题,觉得有必要记录一下,以备不时之需

一. 预备知识

首先简要介绍一下java异常,在Java中异常分为Error和Exception。这两类都是接口Throwable的子类,Error及Exception及其子类之间的关系,大致可以用下图简述:

Error与Exception: Error仅在java的虚拟机中发生,用户无需在程序中捕捉或者抛出Error。Exception分为一般的Exception和RuntimeException两类,其中,RuntimeException为Unchecked型,而Exception为Checked型。

checked与unchecked

checked: 一般是指程序不能直接控制的外界情况,是指在编译的时候就需要检查的一类exception,用户程序中必须采用try-catch机制处理或者通过throws交由调用者来处理。这类异常,主要指除了Error以及RuntimeException及其子类之外的异常。unchecked:是指那些不需要在编译的时候就要处理的一类异常。在java体系里,所有的Error以及RuntimeException及其子类都是unchecked异常。可直白的理解为:不需要try-catch等机制处理的异常,可以认为是unchecked的异常。

二. NoClassDefDoundErr与ClassNotFoundException的差别

           通过上面的介绍,可以明确:ClassNotFoundException,NoClassDefDoundError这两个Java类都属于异常,同时,它们分别属于checked exception和unchecked exception。 

        查阅Java API文档,理清ClassNotFonudException和NoClassDefFoundError的继承关系如下: 

        1.  ClassNotFonudException->ReflectiveOperationException->Exception          2.  NoClassDefFoundError->LinkageError->Error           NoClassDefFoundError祖先是Error,属于unchecked Exception,Error仅在java的虚拟机中发生,用户无需在程序中捕捉或者抛出Error, Error类描述了Java运行时系统的内部错误和资源耗尽错误等不可挽救的错误,会直接让程序宕掉。这种错误一旦出现,除了简单的报告给用户,并尽力使程序安全终止之外,一般也没有别的解决办法。

三. Java API对两种异常的描述

ClassNotFoundExceptionJava API的定义:      当应用程序试图使用以下方法通过字符串名加载类:        * Class类中的forName方法。        * ClassLoader类中的findSystemClass方法。        * ClassLoader类中的loadClass方法。      但却找不到具有指定名称的类的定义时,会抛出异常。 解释与理解     之所以会抛出异常,是因为我们在程序中使用上述方法主动装载某些类,但却找不到具有指定名称的类的定义。ClassNotFoundException异常只出现在你的应用程序主动的装载类的过程中,这个异常很多时候出现在我们的应用框架在初始化或者运行中动态装载已配置的类的过程中。这种情况下我们应该首先检查我们的配置或者参数是否错误,是否企图装载一个并不存在的类,如果配置没有错误,我们就应该查看Classpath是否配置错误而导致ClassLoader无法找到这个类,也应该检查要装载的类是否在一个jar包中而我们在引入这个jar包的过程中是否有遗漏或错误(这里jar包的版本也是一个需要格外注意的问题,很多时候混乱的jar包版本会造成太多的麻烦)。 NoClassDefDoundError Java API描述:     当 Java 虚拟机或 ClassLoader 实例试图在类的定义中加载(作为通常方法调用的一部分或者作为使用 new 表达式创建的新实例的一部分),但无法找到该类的定义时,抛出此异常。 当前执行的类被编译时,所搜索的类定义存在,但无法再找到该定义。 解释与理解         NoClassDefFoundErr异常一般出现在我们编译环境和运行环境不一致的情况下,就是说我们有可能在编译过后更改了Classpath或者jar包所以导致在运行的过程中JVM或者ClassLoader无法找到这个类的定义(我曾经在编译后作了一次jar包的清理,然后应用就送给了我一个这样的礼物)。

       我们经常用SDK开发应用,开发的过程中要引入很多jar包,有些SDK也会设定自己的Classpath。编译过程结束后在运行的过程中就要将已开发的应用和所有引入的jar包拷贝到应用服务器的相应目录下才可以运行,而应用服务器使用的Classpath也很有可能与SDK的不同,在这个过程中就有很大的几率造成双方环境不一致。所以很多开发者就会遇到在SDK中可以编译,运行也没有问题,但是同样的程序放到应用服务器上就出现NoClassDefFoundErr这个异常这种情况,这是让初学者很挠头的一个问题。

引用文章:https://www.cnblogs.com/shihuc/p/5201905.html

【特别说明】有任何疑问,请扫描二维码提问:

转载请注明原文地址: https://www.6miu.com/read-2614132.html

最新回复(0)