【发布时间】:2011-08-11 09:33:03
【问题描述】:
我在目录 C:\D\JavaProjects 中名为 test.java 的文件中有以下代码
class test
{
public static void main( String[] str )
{
System.out.println( "Hello, World! from test" );
}
}
class Test
{
public static void main( String[] str )
{
System.out.println( "Hello, World!" );
}
}
当我执行“javac test.java”时,它会输出 test.class。现在,如果我执行“java test”,我会得到以下输出:
线程“主”java.lang.NoClassDefFoundError 中的异常:测试(错误名称:测试) 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClassCond(未知来源) 在 java.lang.ClassLoader.defineClass(未知来源) 在 java.security.SecureClassLoader.defineClass(未知来源) 在 java.net.URLClassLoader.defineClass(未知来源) 在 java.net.URLClassLoader.access$000(未知来源) 在 java.net.URLClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 sun.misc.Launcher$AppClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 找不到主类:test。程序将退出。
但是当我做“java测试”时,我得到了
你好,世界!
现在,如果我简单地颠倒两个类声明的出现,例如在测试之前声明 Test,java 编译器会输出文件 Test.class。现在做“java test”会给出输出:
你好,世界!来自测试
但是“java Test”给出了
线程“主”java.lang.NoClassDefFoundError 中的异常:测试(错误名称:测试) 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClassCond(未知来源) 在 java.lang.ClassLoader.defineClass(未知来源) 在 java.security.SecureClassLoader.defineClass(未知来源) 在 java.net.URLClassLoader.defineClass(未知来源) 在 java.net.URLClassLoader.access$000(未知来源) 在 java.net.URLClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 sun.misc.Launcher$AppClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 找不到主类:测试。程序将退出。
现在,我知道在同一个文件中有两个带有 main 的类是很奇怪的,但这种行为似乎完全不合逻辑,更像是一个错误。有人可以指出指定此行为的 Java 语言规范的适当部分吗?非常感谢您的帮助。
【问题讨论】:
-
这里已经有人回答了:stackoverflow.com/questions/4837723/…