博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NoClassDefFoundError && ClassNotFoundException
阅读量:5333 次
发布时间:2019-06-15

本文共 2462 字,大约阅读时间需要 8 分钟。

两种错误都是涉及类加载问题,类层次结构如下:

608528-20180417122637861-1133916337.png

NoClassDefFoundError是系统错误,ClassNotFoundException是系统异常,可以捕获。 NoClassDefFoundError发生在对Class原始文件解析通过类的全限定名在类路径下无法找到相关类的定义时;ClassNotFoundException发生在通过调用Class.forName()、类加载器的loadClass/findClass在程序中自定义加载类时。

  • 注: 以下测试代码文件夹层次结构: *

608528-20180417122143445-1251989272.png

下面为NoClassDefFoundError测试程序,TestReference.java程序内引用google.guava包里的第三方类。在编译时将第三方的guava-23.0.jar加入到classpath里,编译通过,运行时不加classpath,然后程序就会抛出NoClassDefFoundError,通过异常堆栈可以看出,底层也是通过loadClass来尝试加载引用的类的。

import com.google.common.base.*;import com.google.common.collect.*;import java.util.*;public class TestReference{  public static void main(String[] args){    Map
a = Maps.newHashMap(); }}
javac -cp guava-23.0.jar TestReference.java// 编译OKjava TestReference// 报错:// Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/col// lect/Maps//         at TestReference.main(TestReference.java:6)// Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps//         at java.net.URLClassLoader.findClass(Unknown Source)//         at java.lang.ClassLoader.loadClass(Unknown Source)//         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)//         at java.lang.ClassLoader.loadClass(Unknown Source)//         ... 1 morejava TestReference -cp .;guava-23.0.jar// 执行OK

通过研究Class文件结构可以得出以下结论: 当Java程序运行时,JVM加载TestReference.class文件,解析出methodRef下code属性里的代码内容,通过代码里写的类短名称加上import的空间定位引用类的全限定名,然后通过全限定名在类路径下加载相关的类,当没有找到时抛出该错误。这个错误是JVM抛出。

下面是ClassNotFoundException示例代码,ClassNotFoundException代码里通过Class.forName("") 加载google.guava的类:

public class TestClassForname{  public static void main(String[] args) throws Exception{      Class a = Class.forName("com.google.common.collect.Maps");  }}
javac TestClassForname.java// 编译OKjava TestClassForname// Exception in thread "main" java.lang.ClassNotFoundException: com.google.common.c// ollect.Maps//         at java.net.URLClassLoader.findClass(Unknown Source)//         at java.lang.ClassLoader.loadClass(Unknown Source)//         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)//         at java.lang.ClassLoader.loadClass(Unknown Source)//         at java.lang.Class.forName0(Native Method)//         at java.lang.Class.forName(Unknown Source)//         at TestClassForname.main(TestClassForname.java:4)

ClassNotFoundException这个异常的定义就是没有加载到类就抛出这个异常,上面说的NoClassDefFoundError底层也是通过抛出这个异常触发的,只不过JVM会在上面场合下通过捕获ClassNotFoundException然后转而抛出NoClassDefFoundError错误。

转载于:https://www.cnblogs.com/caiyao/p/8863103.html

你可能感兴趣的文章
[Windows Server]安装系统显示“缺少计算机所需的介质驱动程序”解决方案
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
[工具] Sublime Text 使用指南
查看>>
Hangfire在ASP.NET CORE中的简单实现方法
查看>>
Algorithm——何为算法?
查看>>
Web服务器的原理
查看>>
小强升职计读书笔记
查看>>
常用的107条Javascript
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>