`
zyl
  • 浏览: 486743 次
社区版块
存档分类
最新评论

基本的类装入异常

    博客分类:
  • jdk
阅读更多
    在java中,类装载异常虽然不是很常见,可如果发生异常,其处理还是比较麻烦的。
    下面的几种异常是比较常见的:
ClassNotFoundException
    ClassNotFoundException 是最常见的类装入异常类型。它发生在装入阶段。Java 规范对 ClassNotFoundException 的描述是这样的:
    当应用程序试图通过类的字符串名称,使用以下三种方法装入类,但却找不到指定名称的类定义时抛出该异常。
    * 类 Class 中的 forName() 方法。
    * 类 ClassLoader 中的 findSystemClass() 方法。
    * 类 ClassLoader 中的 loadClass() 方法。
    所以,如果显式地装入类的尝试失败,那么就抛出 ClassNotFoundException。
    这些异常修复起来通常比较简单。可以用  verbose 选项检查类路径,确保使用的类路径设置正确。如果类路径设置正确,但是仍然看到这个错误,那么就是需要的类在类路径中不存在。要修复这个问题,可以把类移 动到类路径中指定的目录或 JAR 文件中,或者把类所在的位置添加到类路径中。

NoClassDefFoundError
    NoClassDefFoundError 是类装入器在装入阶段抛出的另一个常见异常。JVM 规范对 NoClassDefFoundError 的定义如下:
    如果 Java 虚拟机或 ClassLoader 实例试图装入类定义(作为正常的方法调用的一部分,或者作为使用 new 表达式创建新实例的一部分),但却没有找到类定义时抛出该异常。
    当目前执行的类已经编译,但是找不到它的定义时,会存在 searched-for 类定义。
    实际上,这意味着 NoClassDefFoundError 的抛出,是不成功的隐式类装入的结果。
    简单说来,就是引用的类在类路径中没有找到。
ClassCastException
    类装入器能够抛出的另一个异常是 ClassCastException。它是在类型比较中发现不兼容类型的时候抛出的。JVM 规范指定 ClassCastException 是:
    该异常的抛出,表明代码企图把对象的类型转换成一个子类,而该对象并不是这个子类的实例。
UnsatisfiedLinkError
    在把本地方法调用链接到对应的本机定义时,类装入器扮演着重要角色。如果程序试图装入一个不存在或者放错的本机库时,在链接阶段的解析过程会发生 UnsatisfiedLinkError。JVM 规范指定 UnsatisfiedLinkError 是:
    对于声明为 native 的方法,如果 Java 虚拟机找不到和它对应的本机语言定义,就会抛出该异常。
    当调用本机方法时,类装入器会尝试装入定义了该方法的本机库。如果找不到这个库,就会抛出这个错误。
    本机库的装入由调用 System.loadLibrary() 方法的类的类装入器启动 ,根据使用的类装入器,会搜索不同的位置:
    * 对于由 bootstrap 类装入器装入的类,搜索 sun.boot.library.path。
    * 对于由扩展类装入器装入的类,先搜索 java.ext.dirs,然后是 sun.boot.library.path,然后是 java.library.path。
    * 对于由系统类装入器装入的类,搜索 sun.boot.library.path,然后是 java.library.path。
ClassCircularityError
    JVM 规范指定 ClassCircularityError 的抛出条件是:
    类或接口由于是自己的超类或超接口而不能被装入。
    这个错误是在链接阶段的解析过程中抛出的。这个错误有点奇怪,因为 Java 编译器不允许发生这种循环情况。但是,如果独立地编译类,然后再把它们放在一起,就可能发生这个错误。
ClassFormatError
JVM 规范指出,抛出 ClassFormatError 的条件是:
    负责指定所请求的编译类或接口的二进制数据形式有误。
    这个异常是在类装入的链接阶段的校验过程中抛出。如果字节码发生了更改,例如主版本号或次版本号发生了更改,那么二进制数据的形式就会有误。例如,如果对字节码故意做了更改,或者在通过网络传送类文件时现出了错误,那么就可能发生这个异常。
    修复这个问题的惟一方法就是获得字节码的正确副本,可能需要重新进行编译。
ExceptionInInitializerError
根据 JVM 规范,抛出 ExceptionInInitializer 的情况是:
    * 如果初始化器突然完成,抛出一些异常 E,而且 E 的类不是 Error 或者它的某个子类,那么就会创建 ExceptionInInitializerError 类的一个新实例,并用 E 作为参数,用这个实例代替 E。
    * 如果 Java 虚拟机试图创建类 ExceptionInInitializerError 的新实例,但是因为出现 Out-Of-Memory-Error 而无法创建新实例,那么就抛出 OutOfMemoryError 对象作为代替。

分享到:
评论

相关推荐

    WebSphere Application Server V7 理解类装入器 中文翻译版

    ### WebSphere Application Server V7: 理解...通过掌握类装入器的基本概念和WebSphere特有的配置选项,开发者和系统管理员可以有效地管理应用程序的类加载过程,从而避免常见的类加载异常,并提高应用程序的整体性能。

    java 类加载调试

    他们提供的见解有助亍理解和解决常见的 Java 异常,例如 NoClassDefFoundError 和 ClassNotFoundException,以及更有挅戓性的问题,例如类装入器约束迗反和死锁。在第 1 部分中,他们详细描述了 Java 类装入的工作...

    一键装入Recovery.rar

    3. **清除数据/恢复出厂设置:** 当手机运行异常或应用冲突时,用户可以选择清除缓存分区或者全部数据,使手机回到出厂状态。 4. **安装zip文件:** 用户可以在Recovery模式下安装ZIP格式的更新包或模块,比如优化...

    db2jcc.jar

    为了解决“在装入驱动程序时发生了安全性异常”,你可以尝试以下步骤: 1. **检查JDK版本**:确保你的Java环境确实是`jdk8`,并且系统路径正确设置。 2. **驱动路径**:确认`db2jcc.jar`或`db2jcc4.jar`被正确放置...

    动态装入并初始化Qt插件.doc

    本示例代码展示了如何在Qt应用中实现动态装入并初始化插件。以下是详细的知识点解释: 1. **插件接口定义**:首先,你需要定义一个插件接口,这是所有插件必须遵循的公共协议。在`ExamplePluginInterface.h`中,你...

    金蝶Apusic应用服务器V6参考b手册b.doc

    oClassLoader.loadClass()(使用指定的Classloader进行装载)oClass.forName()(使用当前类的Caller Classloader进行装载)当调用上述方法的时候,指定的Class(以类名为参数)由Classloader装入。这两个方法的行为...

    DB2-ErrorCode解释大全

    这类警告可能源自函数内部的异常处理机制,也可能是在函数执行过程中遇到的非致命问题。 **SQLCODE:** +464 **SQLSTATE:** 01609 **说明:** 命名的存储过程超出了它可能返回的查询结果集的个数限制。 当存储过程...

    shiro权限管理+SSM登陆+spring定时器+基本博客管理

    标题 "shiro权限管理+SSM登陆+spring定时器+基本博客管理" 涵盖了四个关键领域:Shiro权限管理、SSM框架集成、Spring...在实际开发中,还需要考虑性能优化、异常处理、安全性等问题,以确保系统的稳定性和用户体验。

    行业分类-设备装置-单机智能自动铅笔装盒机.zip

    在描述中同样提到“行业分类-设备装置-单机智能自动铅笔装盒机.zip”,这进一步强调了文件内容的焦点,即一种能够自动化完成铅笔装入盒子的单机设备,可能涵盖了设备的设计原理、工作流程、技术特点和优势等内容。...

    C++考试吉大历年02-05考试题

    了解并熟练掌握这些基本概念是学习C++的第一步。 其次,C++中的类和对象是面向对象编程的核心,因此在考试中,可能会有涉及封装、继承、多态等面向对象概念的题目。考生需要理解类的构造函数和析构函数,以及如何...

    程序设计教程 用C++语言编程 第二版 课后答案

    构造数据类型是指由基本数据类型组合而成的数据类型,例如数组、结构体、类等。构造数据类型可以实现数据的封装和抽象。 第6章 数据抽象――类 类是指封装了数据和操作数据的方法的数据类型。类可以实现数据的抽象...

    101个专业VB.NET实例代码 包括完整项目文件

    7. **异常处理** - Try...Catch...Finally结构:捕获和处理运行时错误,确保程序的健壮性。 8. **多线程** - Thread类:创建和管理多个并发执行的线程。 - BackgroundWorker组件:在后台执行长时间运行的操作,...

    模拟文件系统

    这个系统作为一个课程设计作品,旨在让学生理解和掌握文件系统的基本概念、数据结构以及操作原理。通过此项目,开发者可以学习到如何在软件层面模拟操作系统中的文件管理功能,这对于深入理解计算机系统的工作方式...

    SpringBoot-MyBatis-DataSource(多数据源以及动态切换)

    在Spring Boot应用中,集成MyBatis作为...在实际项目中,还需要考虑事务管理、异常处理等问题,确保在切换数据源时,事务的一致性和正确性。同时,注意在不同数据源之间进行数据同步或数据隔离,以满足系统的业务需求。

    计算机系统2019A参考答案 1

    7. 陷阱、故障这类异常处理后,可以通过恢复现场返回到异常发生时的指令,而键盘中断则不会。 8. 进程可以通过收到信号、从主程序返回或执行`exit`函数而终止,但执行`wait`函数是等待子进程结束,而不是导致进程...

    四川大学 研究与开发实验报告

    2. **Java容器**:用来组织和管理界面元素,如在不同类中创建的box,以及在主界面中装入各个操作面板的容器。 3. **窗口监听器**:在GUI中,用于监听用户操作并响应的机制,如在各个类中实现的actionPerformed()方法...

    websphere下部署CXF项目jar包冲突问题解决方式

    这通常可以在服务的“类装入器”设置中完成,确保“父最后”策略被启用,这意味着应用的类加载器将在服务器类加载器之后尝试加载类。 6. **重启服务**:最后,不要忘记重启WAS服务,以使上述更改生效。注意,这里所...

    行业分类-设备装置-卷扬式铁水包加盖系统.zip

    一、卷扬式铁水包的基本概念 卷扬式铁水包是一种专门用于运输高温铁水的容器,它由耐高温的材料制成,可以承受极高的温度和重量。铁水包通常设计为椭圆形或球形,以减少铁水在运输过程中的热量损失和表面张力,确保...

Global site tag (gtag.js) - Google Analytics