我的课程中有3个课程
1. LinkedListProgram : contains PSVM
2. LinkedList extends Node {
3. private class Node {
}
}
我正在通过以下命令编译java程序
javac -d bin .\LinkedListProgram.java
编译成功,我在bin文件夹中看到了3个.class文件
LinkedList$Node.class
LinkedList.class
LinkedListProgram.class
现在我想执行程序,我使用的命令是
java -cp bin LinkedListProgram
这给了我一个堆栈跟踪错误,我将其粘贴到
下面Exception in thread "main" java.lang.NoClassDefFoundError: Node
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at LinkedListProgram.main(LinkedListProgram.java:137)
Caused by: java.lang.ClassNotFoundException: Node
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 13 more
如何解决这个问题?根据我的实验,如果我不在另一个目录中生成.class文件,那么java程序运行正常。
我从bin文件夹运行程序有什么问题?
完整的源代码可以在Github
中看到我认为将整个代码粘贴到我的OP中并不是一个好主意,因为代码有点冗长。请转到上面的链接获取完整代码。
答案 0 :(得分:2)
出现问题是因为您正在尝试从其父类扩展内部类。
LinkedList extends Node {
class Node{}
}
信息:私有内部类在其父类的上下文中仅存在 ,因此这意味着Node
在LinkedList
之外不可见。 甚至不在父类定义中!
但真正的问题不是Node是私有的,
让我们说你Node
成为public
,这样你就可以在定义你的父类时引用你的内部类LinkedList extends LinkedList.Node
。
但这会导致从LinkedList
到本身的循环引用。哪个不允许!!!
解决方案是将两个类放在单独的文件中。
在您的情况下,您在一个文件中包含所有类,只需在Node
类定义之后(或之前)放置LinkedList
类定义