我在名为test.java的文件中有以下代码,该文件位于目录C:\ D \ JavaProjects
中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”,我会得到以下输出:
线程“main”中的异常java.lang.NoClassDefFoundError:test(错误名称:Test) at java.lang.ClassLoader.defineClass1(Native Method) 在java.lang.ClassLoader.defineClassCond(未知来源) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) 在java.net.URLClassLoader.access $ 000(未知来源) 在java.net.URLClassLoader $ 1.run(未知来源) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher $ AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) 找不到主类:测试。程序将退出。
但是当我做“java Test”时,我得到了
你好,世界!
现在,如果我简单地反转两个类声明的出现,以便在测试之前声明Test,则java编译器输出文件Test.class。现在做“java test”给出输出:
你好,世界!来自测试
但“java Test”给出了
线程“main”中的异常java.lang.NoClassDefFoundError:Test(错误名称:test) at java.lang.ClassLoader.defineClass1(Native Method) 在java.lang.ClassLoader.defineClassCond(未知来源) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) 在java.net.URLClassLoader.access $ 000(未知来源) 在java.net.URLClassLoader $ 1.run(未知来源) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher $ AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) 找不到主要类:测试。程序将退出。
现在,我知道在同一个文件中有两个带有main的类是很奇怪的,但这种行为似乎完全不合逻辑,更像是一个bug。有人能指出我指定这种行为的Java语言规范的相应部分吗?非常感谢您的帮助。
答案 0 :(得分:9)
据推测,你在Windows上运行,对吗?
这意味着你不能只有两个不同的类 - 因为它们最终都想要在同一个文件中,因为Test.class
和test.class
实际上是相同的文件名在不区分大小写的文件系统中。
这不是Java中的一个错误 - 只是使用不区分大小写的文件系统与一种附加文件名意义的语言的不幸但自然的必然结果。
答案 1 :(得分:-3)
@dark_secrets,您必须在JAVA中以大写字母开始一个类名,否则编译时会出错。
答案 2 :(得分:-4)
使用public(然后是类名)....这肯定会起作用....