如何使用Inner类执行JAVA程序?

时间:2015-10-31 20:55:14

标签: java

我的课程中有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中并不是一个好主意,因为代码有点冗长。请转到上面的链接获取完整代码。

1 个答案:

答案 0 :(得分:2)

出现问题是因为您正在尝试从其父类扩展内部类。

LinkedList extends Node {
    class Node{}     
}

信息:私有内部类在其父类的上下文中仅存在 ,因此这意味着NodeLinkedList之外不可见。 甚至不在父类定义中!

但真正的问题不是Node是私有的,

让我们说你Node成为public,这样你就可以在定义你的父类时引用你的内部类LinkedList extends LinkedList.Node
但这会导致从LinkedList本身循环引用。哪个允许!!!

解决方案是将两个类放在单独的文件中。

在您的情况下,您在一个文件中包含所有类,只需在Node类定义之后(或之前)放置LinkedList类定义