分享
 
 
 

类装入问题解密,第 2 部分: 基本的类装入异常

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

这个四部分构成的文章系列研究 java™ 的类装入问题,帮助应用程序开发人员理解和调试可能碰到的问题。在第 2 部分中,来自 IBM Hursley 实验室的作者 Lakshmi Shankar 和 Simon Burns 处理的一些异常,虽然相当简单,但是却经常困扰着新老 Java 开发人员。

本文是系列中四篇文章的第二篇,它考察了一般在运行应用程序时抛出的各种类装入异常。这些异常虽然常见,但是 Java 程序员对它们的理解通常不深。本文将逐个提供能够突出这些异常行为特点的具体示例,解释造成异常的原因,并介绍一些可行的解决技术。文章从非经常见的 ClassNotFoundException 开始,逐渐转移到不太常见的异常,例如 ExceptionInInitializerError。

在开始这篇文章之前,应当熟悉类装入委托模型,以及类链接的阶段和过程。我们强烈建议您从阅读这个系列的 第一篇文章 开始。

ClassNotFoundException

ClassNotFoundException 是最常见的类装入异常类型。它发生在装入阶段。Java 规范对 ClassNotFoundException 的描述是这样的:

当应用程序试图通过类的字符串名称,使用以下三种方法装入类,但却找不到指定名称的类定义时抛出该异常。

类 Class 中的 forName() 方法。

类 ClassLoader 中的 findSystemClass() 方法。

类 ClassLoader 中的 loadClass() 方法。

所以,假如显式地装入类的尝试失败,那么就抛出 ClassNotFoundException。清单 1 中的测试用例提供的示例代码抛出了一个 ClassNotFoundException:

清单 1. ClassNotFoundExceptionTest.java

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLClassLoader;

public class ClassNotFoundExceptionTest {

public static void main(String args[]) {

try {

URLClassLoader loader = new URLClassLoader(new URL[] { new URL(

"file://C:/CL_Article/ClassNotFoundException/")});

loader.loadClass("DoesNotExist");

} catch (ClassNotFoundException e) {

e.PRintStackTrace();

} catch (MalformedURLException e) {

e.printStackTrace();

}

}

}

这个测试用例定义了一个类装入器(MyClassLoader),用于装入一个不存在的类(DoesNotExist)。当它运行时,会出现以下异常:

java.lang.ClassNotFoundException: DoesNotExist

at java.net.URLClassLoader.findClass(URLClassLoader.java:376)

at java.lang.ClassLoader.loadClass(ClassLoader.java:572)

at java.lang.ClassLoader.loadClass(ClassLoader.java:504)

at ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:11)

因为这个测试试图使用对 loadClass() 的显式调用来进行装入,所以抛出 ClassNotFoundException。

通过抛出 ClassNotFoundException,类装入器提示,定义类时所需要的字节码在类装入器所查找的位置上不存在。这些异常修复起来通常比较简单。可以用 IBM 的 verbose 选项检查类路径,确保使用的类路径设置正确(要获得 verbose 的更多信息,请参阅本系列的 第一篇文章)。假如类路径设置正确,但是仍然看到这个错误,那么就是需要的类在类路径中不存在。要修复这个问题,可以把类移动到类路径中指定的目录或 JAR 文件中,或者把类所在的位置添加到类路径中。

回页首

NoClassDefFoundError

NoClassDefFoundError 是类装入器在装入阶段抛出的另一个常见异常。JVM 规范对 NoClassDefFoundError 的定义如下:

假如 Java 虚拟机或 ClassLoader 实例试图装入类定义(作为正常的方法调用的一部分,或者作为使用 new 表达式创建新实例的一部分),但却没有找到类定义时抛出该异常。

当目前执行的类已经编译,但是找不到它的定义时,会存在 searched-for 类定义。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有