论坛首页 Java企业应用论坛

考你一个最基础的Java问题

浏览 11259 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-07-04  
在座的各位都是Java老手了。那么在下想考考大家的基础,谁能准确回答出ClassNotFoundException和NoClassDefError之间的区别,两者分别会在什么情况出现?
呵呵 开卷考试,可以看JavaDoc的哦~
   发表时间:2006-07-04  
显式调用和非显式的区别吧
0 请登录后投票
   发表时间:2006-07-04  
当你使用字符串去转换类,也就是尝试使用Class.forName等方法去获得一个类的时候,如果这个类不存在,就会抛出ClassNotFoundException。
   而你编译的类无错,但是在运行时刻,缺乏某些必须的类时,就是抛出NoClassDefFoundError。这种情况最常见就是你在编译时,在classpath下有这个类,但是在运行时,你的classpath缺少这个类。
0 请登录后投票
   发表时间:2006-07-04  
ClassNotFoundException发生在装入阶段。
当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。

NoClassDefFoundError: 当目前执行的类已经编译,但是找不到它的定义时

也就是说你如果编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误
0 请登录后投票
   发表时间:2006-07-05  
加载...
连接...
0 请登录后投票
   发表时间:2006-07-05  
ideafrog 写道
加载...
连接...

正解~
哎,为啥NoClassDefError不像ClassNotFoundException那样给出类的名字呢,真恶心~sun的那帮家伙写代码真的太粗线条了
0 请登录后投票
   发表时间:2006-07-07  
说到最好,你还是没有理解两者的差别,反而倒过来怪sun粗线条。唉,有些遗憾............
0 请登录后投票
   发表时间:2006-07-09  
凤舞凰扬 写道
说到最好,你还是没有理解两者的差别,反而倒过来怪sun粗线条。唉,有些遗憾............


其实 sun的确挺粗的
0 请登录后投票
   发表时间:2006-07-21  
ClassNotFound似乎没有什么疑虑
但这个NoClassDef确实让人有点困惑,据javadoc显示是从LinkError来的,应该是link的错,不过还是不知怎么link法。

直接搜了一下api source只有两个类

RMIClassLoader
里面是这样写的

    try {
Class providerClass =
    Class.forName(providerClassName, false,
  ClassLoader.getSystemClassLoader());
return (RMIClassLoaderSpi) providerClass.newInstance();

    } catch (ClassNotFoundException e) {
throw new NoClassDefFoundError(e.getMessage());
竟然是包装了ClassNotFound

第2个是ClassLoader在defineClass方法里
try {
            if (!checkName(name, false))
              throw new NoClassDefFoundError("Illegal name: " + name);
就是检查一下数组里的class名字
感觉也没什么大用

所以对这个NoClassDef还是一头雾水啊
0 请登录后投票
   发表时间:2006-09-19  
ideafrog 写道
加载...
连接...

能这么总结吗?
NoClassDefError是在load .class文件的时候找不到就报这个错了,也就是根本没有加载成功,怎么会是连接错误?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics