我的程序里有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中看到
我觉得把整个代码粘贴到我的操作中不是一个很好的主意,因为代码有点长。请转到上面的链接获取完整的代码。
发布于 2015-11-01 06:30:56
出现问题的原因是您试图从父类扩展内部类。
LinkedList extends Node {
class Node{}
}
信息:私有内部类在其父类的上下文中仅存在于中,因此这意味着Node
在LinkedList
外部不可见。甚至在父类定义中都没有!
但真正的问题不是Node是私有的,
假设您将Node
类设置为public
,这将允许您在定义父类时引用内部类,如下面的LinkedList extends LinkedList.Node
所示。
但这将导致从LinkedList
到自身的循环引用。这是不允许的!
这个问题的解决方案是将这两个类放在单独的文件中。
对于将所有类都放在一个文件中的情况,只需将Node
类定义放在LinkedList
类定义之后(或之前
https://stackoverflow.com/questions/33456533
复制相似问题