2011-10-02 132 views
0

软件包当属于一个包一个类文件,然后 初学者

package PackageName; 

被包括在该文件中的源代码。 所以当JVM通过写

java PackageName.classfilename 

它被执行调用。

是否“package PackageName”保证jvm这个classfile属于这个包? 因为如果我们忽略了“包软件包名”语句,则JVM还发现了类文件,但给

Exception in thread "main" java.lang.NoClassDefFoundError: Classfilename 
wrongname PackageName/ClassfileName 

这意味着JVM发现该文件,但不存在用于它认为这个类文件有某种原因错误的名字。

回答

3

你的类的包声明必须与你的代码的文件夹结构相匹配。 JVM使用包从方法的可见性到解决两个类可能具有相同名称的情况的几个“任务”。 NoClassDefFoundError实际上意味着JVM 不能通过找到包含您所提供软件包的类。如果您省略类的包定义,并运行程序,如: java ClassFileName 只要您从类所在的文件夹运行java命令,JVM就会找到该类。

另外...软件包名称应该全部小写,类名称应该以大写字母开头。 :)当其他人阅读你的代码时,约定是非常有用的!

希望评论有帮助。

+0

谢谢先生。 非常感谢你 – user961690

+0

不客气=) – pcalcao

1

类文件需要在文件系统上存在,与包名中定义的层次结构相同。如果您删除了软件包名称,我相信您必须将jar文件的根文件夹中的文件用于“未命名”软件包中。有可能您从源文件中删除了包行,但仍将类定义保留在PackageName文件夹中。

+0

谢谢主席先生的回复。 – user961690

+0

先生,我包含正确的包名称并编译创建类文件,将其放入包文件夹中。它正确执行。然后我删除了类文件,jvm找不到它,因此出现了“线程中的异常”main“java.lang.NoClassDefFoundError:Classfilename”。然后,我编译了没有“包声明”的源代码,并将其带入包文件夹。这次,jvm提出了“线程中的异常”主“错误名称PackageName/ClassfileName”。因此,我认为jvm找出该文件,但认为它是一个错误的文件。谢谢先生 – user961690

+2

琐事时间!这是javac和java可执行文件的要求,而不是Java语言或虚拟机。从技术上讲,Java规范(JLS的7.2节和VM规范的2.7节)不需要源代码树来匹配包结构,这是一个实现决定。另一种存储机制的例子是oracle db - 它将源代码和字节码直接存储在数据库中。 –