单个Java文件中的多个类,每个类都有一个主方法 - 意外行为? [英] Multiple classes in a single Java file, each with a main method - unexpected behavior?

查看:277
本文介绍了单个Java文件中的多个类,每个类都有一个主方法 - 意外行为?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在名为test.java的文件中有以下代码,该文件位于目录C:\D\JavaProjects

I have got the following code in a file called test.java which is located inside the directory 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,我会得到以下输出:

When I do "javac test.java" it outputs test.class. Now, if I do "java test" I get the following output:


线程main中的异常java.lang.NoClassDefFoundError:test (错误的名字:测试)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass (未知来源)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access $ 000(未知来源)
at java.net.URLClassLoader $ 1.run(未知来源)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown)来源)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher $ AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass (未知来源)
找不到主要类:test。程序将退出。

Exception in thread "main" java.lang.NoClassDefFoundError: test (wrong name: Test) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) 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) Could not find the main class: test. Program will exit.

但当我执行java Test时,我得到

But when I do "java Test" I get

Hello,World!

Hello, World!

现在,如果我简单地反转两个类声明的出现,这样在测试之前声明Test,java编译器输出文件Test.class。现在做java test给出输出:

Now, if I simply reverse the occurrence of the two class declarations, such that Test is declared BEFORE test, the java compiler outputs the file Test.class. Now doing "java test" gives the output:


Hello,World!来自测试

Hello, World! from test

但java Test给出了

but "java Test" gives


线程main中的异常java.lang.NoClassDefFoundError:测试(错误名称:test)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond (未知来源)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown)来源)
at java.net.URLClassLoader.access $ 000(未知来源)
at java.net.URLClassLoader $ 1.run(未知来源)
at java.security.AccessController.doPrivileged(Native方法)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher $ AppClassLoader.loadClass(Unknown)来源)java.lang.Class上的
Loader.loadClass(Unknown Source)
找不到主类:Test。程序将退出。

Exception in thread "main" java.lang.NoClassDefFoundError: Test (wrong name: test) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) 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) Could not find the main class: Test. Program will exit.

现在,我知道在同一个文件中有两个带有main的类是很奇怪的,但是这个行为似乎完全不合逻辑,更像是一个错误。有人能指出我指定这种行为的Java语言规范的相应部分吗?非常感谢您的帮助。

Now, I know it is very strange to have two classes with main in them in the same file, but this behavior seems completely illogical and more like a bug. Can somebody point me to the appropriate section of the Java Language Specification that specifies this behavior? Many thanks in advance for the help.

推荐答案

大概你在Windows上运行,对吗?

Presumably you're running on Windows, right?

这意味着你不能只有两个不同的类 - 因为它们最终都想要在同一个文件中,因为 Test.class test.class 在不区分大小写的文件系统中实际上是相同的文件名。

That means you can't have two classes which differ only in case - because they'll both end up wanting to be in the same file, as Test.class and test.class are effectively the same filename in case-insensitive file systems.

它是并不是Java中的一个错误 - 只是将一个不区分大小写的文件系统与一个附加于文件名意义的语言结合起来的一个不幸但自然的必然结果。

It's not really a bug in Java - just an unfortunate but natural corollary of using a case-insensitive file system in conjunction with a language which attaches meaning to filenames.

这篇关于单个Java文件中的多个类,每个类都有一个主方法 - 意外行为?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆