dar*_*ets 4 java program-entry-point
我在名为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!" );
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行"javac test.java"时,它输出test.class.现在,如果我做"java test",我会得到以下输出:
线程"main"中的异常java.lang.NoClassDefFoundError:java.lang.ClassLoader.defineClass1(本机方法)中的java.lang.ClassLoader.defineClass1(本地方法)中的java.lang.ClassLoader上的java(错误名称:Test). java.net.URLClassLoader.defineClass(未知来源)的java.securityClassLoader.defineClass(未知来源)的javaC.URLClassLoader.access $ 000(未知来源)java.net.URLClassLoader $ 1上的defineClass(未知来源).在java.security.AccessController.doPrivileged(本机方法)上的java.security.AccessController.doPrivileged(本机方法)中运行(未知来源),位于java.lang.ClassLoader.findClass(未知来源),位于sun.misc.Launcher $ AppClassLoader上的java.lang.ClassLoader.loadClass(未知来源). java.lang.ClassLoader.loadClass(Unknown Source)中的loadClass(Unknown Source)无法找到主类:test.程序将会退出.
但是,当我做"java测试"时,我得到了
你好,世界!
现在,如果我简单地反转两个类声明的出现,以便在测试之前声明Test,则java编译器输出文件Test.class.现在做"java test"给出输出:
你好,世界!从测试
但"java Test"给出了
线程"main"中的异常java.lang.NoClassDefFoundError:在java.lang.ClassLond的java.lang.ClassLoader.defineClassCond(未知源)的java.lang.ClassLoader.defineClass1(本地方法)中测试(错误名称:test). java.net.URLClassLoader.defineClass(未知来源)的java.securityClassLoader.defineClass(未知来源)的javaC.URLClassLoader.access $ 000(未知来源)java.net.URLClassLoader $ 1上的defineClass(未知来源).在java.security.AccessController.doPrivileged(本机方法)上的java.security.AccessController.doPrivileged(本机方法)中运行(未知来源),位于java.lang.ClassLoader.findClass(未知来源),位于sun.misc.Launcher $ AppClassLoader上的java.lang.ClassLoader.loadClass(未知来源). java.lang.ClassLoader.loadClass(Unknown Source)中的loadClass(Unknown Source)无法找到主类:Test.程序将会退出.
现在,我知道在同一个文件中有两个带有main的类是很奇怪的,但这种行为似乎完全不合逻辑,更像是一个bug.有人能指出我指定这种行为的Java语言规范的相应部分吗?非常感谢您的帮助.
大概是你在Windows上运行,对吧?
这意味着你不能只有两个不同的类 - 因为它们最终都希望在同一个文件中,Test.class并且test.class在不区分大小写的文件系统中实际上是相同的文件名.
它实际上并不是Java中的一个错误 - 只是将一个不区分大小写的文件系统与一个附加于文件名意义的语言结合使用的不幸但自然的必然结果.