Java中基本的类装入异常
在java中,类装载异常虽然不是很常见,可如果发生异常,其处理还是比较麻烦的。
下面的几种异常是比较常见的:
ClassNotFoundException
ClassNotFoundException 是最常见的类装入异常类型。它发生在装入阶段。Java 规范对 ClassNotFoundException 的描述是这样的:
当应用程序试图通过类的字符串名称,使用以下三种方法装入类,但却找不到指定名称的类定义时抛出该异常。
* 类 Class 中的 forName() 方法。
* 类 ClassLoader 中的 findSystemClass() 方法。
* 类 ClassLoader 中的 loadClass() 方法。
所以,如果显式地装入类的尝试失败,那么就抛出 ClassNotFoundException。
这些异常修复起来通常比较简单。可以用 verbose 选项检查类路径,确保使用的类路径设置正确。如果类路径设置正确,但是仍然看到这个错误,那么就是需要的类在类路径中不存在。要修复这个问题,可以把类移动到类路径中指定的目录或 JAR 文件中,或者把类所在奈恢锰砑拥嚼嗦肪吨小?br>
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特有的配置选项,开发者和系统管理员可以有效地管理应用程序的类加载过程,从而避免常见的类加载异常,并提高应用程序的整体性能。
他们提供的见解有助亍理解和解决常见的 Java 异常,例如 NoClassDefFoundError 和 ClassNotFoundException,以及更有挅戓性的问题,例如类装入器约束迗反和死锁。在第 1 部分中,他们详细描述了 Java 类装入的工作...
- **`ClassLoader`**:这是Java中的一个抽象类,定义了几个关键的方法来支持类的装载。 - **`loadClass(String name, boolean resolve)`**:根据给定的全限定名加载类。如果resolve为true,则在类加载后会对其进行...
3. **应用程序类装载器(Application Class Loader)**:它是默认的应用程序类装载器,负责加载用户类路径(`java.class.path`)中定义的类。用户可以通过环境变量`CLASSPATH`来控制哪些类路径被包含在内。应用程序类...
在Java中,类装载器 把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化。其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。各个步骤的主要工作如下: * ...
在Java中,类加载机制是通过ClassLoader来完成的,该机制在JDK 1.2以后变得更加复杂和灵活。 类加载机制的主要组件是ClassLoader,它是Java.lang包中的一个类。ClassLoader的主要目标是对类的恳求供应服务。当JVM...
在Java中,类的装载是指将类文件中的字节码加载到JVM中,并将其变成JVM的一部分。这一过程由类装载器完成,主要包括以下三个阶段: 1. **装载**:查找并导入类或接口的二进制数据。 2. **链接**:链接过程进一步...
这个类可能包含了装入位图文件、在窗口上显示位图以及进行一些基本的位图操作(如缩放、旋转等)的功能。在C++中,我们通常会使用GDI(Graphics Device Interface)或GDI+库来处理这些任务。 在C++中,装入位图通常...
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...
JVM每次装入类文件时都需要一个称为ClassLoader的对象,这个对象负责把新的类装入正在运行的JVM。JVM给ClassLoader一个包含了待装入类名字的字符串,然后由ClassLoader负责找到类文件,装入原始数据,并把它转换成一...
ArrayList 和 LinkedList 是 Java 中两个常用的集合类。ArrayList 是基于数组实现的,LinkedList 是基于双链表实现的。ArrayList 的随机访问集合元素时性能较好,因为可以直接返回数组中 index 位置的元素。...
在Java中执行SQL语句实现查询是非常常见的操作,以下是Java执行SQL语句实现查询的通用方法详解。 首先,需要获取数据库连接,使用JDBCTools.getConnection()方法来获取数据库连接。然后,使用PreparedStatement来...
#### 四、Java中的访问控制符 1. **public**:公有访问,任何类都可以访问。 2. **protected**:保护访问,同一包内的类以及子类可以访问。 3. **final**:常量,表示变量不可更改。 4. **默认(friendly)**:仅...
- **代码装入**:JVM加载类文件到内存中。 - **代码校验**:确保字节码的安全性,防止恶意代码执行。 - **代码执行**:JVM的解释器解析并执行字节码。 5. **Java基本语法**: - **大小写敏感**:Java代码中的...
在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`InvocationHandler`接口实现。`Proxy`类提供了创建代理对象的方法,而`InvocationHandler`接口定义了代理对象在调用接口方法时的行为。 **3. 动态代理的...
这个交互过程发生在相同的Java虚拟机进程中,使得来自Java类并被标志为“本地”的Java方法的调用能够被映射到共享二进制库中的相应函数上,并且将这两者加载到相同的进程空间中。 JNI技术的基本步骤包括: 1. 编写...
- **类加载器的层次结构:** Java 中存在多种类加载器,如`Bootstrap ClassLoader`、`Extension ClassLoader`和`Application ClassLoader`,它们形成了一个层次结构,用于加载不同类型的类。 #### 7. 堆内存与栈...
一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...
一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源...