NoClassDefFoundError
和ClassNotFoundException
有什么区别?
是什么导致它们被抛出?如何解决?
在修改现有代码以包含新的jar文件时,我经常遇到这些throwables。
我在客户端和服务器端都通过Webstart分发了一个Java应用程序。
我遇到的可能原因:
代码客户端的build.xml
中未包含的
我们正在使用
今天,当我遇到这些问题时,我会采取错误的方法来使事情正常进行。我需要更多的清晰度和理解。
最佳答案
与Java API规范的区别如下。
对于 ClassNotFoundException
:
对于 NoClassDefFoundError
:
因此,似乎在成功编译源代码时出现了NoClassDefFoundError
,但是在运行时未找到所需的class
文件。这可能是在分发或生成JAR文件时发生的,其中未包含所有必需的class
文件。
至于ClassNotFoundException
,似乎可能是由于在运行时尝试对类进行反射性调用而引起的,但程序尝试调用的类不存在。
两者之间的区别在于,一个是Error
,另一个是Exception
。 NoClassDefFoundError
是Error
,它来自Java虚拟机,它在查找期望找到的类时遇到问题。由于找不到class
文件,或者与编译时生成或遇到的ClassNotFoundException
文件不同,预期无法在编译时运行的程序无法运行。这是一个非常严重的错误,因为该程序无法由JVM启动。
另一方面,Exception
是ojit_code,因此在某种程度上是可以预期的,并且可以恢复。使用反射是容易出错的(因为有些期望可能不会按预期进行。没有编译时检查以确保所有必需的类都存在,因此查找所需类的任何问题都会在运行时出现。