我编写了一个Java类,它实现了另一个目录中指定的接口。我像这样编译应用程序:
javac ArrayQueue.java -cp QueueArray
类ArrayQueue
实现了目录Queue
中的接口QueueArray
。如果没有指定的类路径,编译器将按预期抛出错误。
然而,在此之后运行程序时,它无法再找到该类:
java ArrayQueue -cp QueueArray
Exception in thread "main" java.lang.NoClassDefFoundError: Queue
可能导致这种情况的原因是什么?
修改:如果我将.class
文件复制到与ArrayQueue.class
相同的目录,该程序可以正常工作。
答案 0 :(得分:1)
这可能会有所帮助。来自JLS, 3rd edition:
Java平台的实现必须至少支持一个 未命名的包裹; 它可能支持多个未命名的包,但是 不要求这样做。每个未命名的编译单元 包由主机系统确定。
在使用分层文件的Java平台的实现中 用于存储包的系统,一种典型的策略是关联一个 每个目录的未命名包; 只有一个未命名的包 一次可观察到的,即与之相关的那个 “当前工作目录。”“当前工作的确切含义 目录“取决于主机系统。
您使用的JVM似乎不支持默认包,除非它们与当前目录相关联,即您启动自定义队列类的目录。
一般来说,使用默认包是个坏主意,我的建议是将两个类与一个包相关联,重新编译并重新测试你的代码。
答案 1 :(得分:0)
使用java -classpath . class_having_main_method