Java File包含所有非公共类,其中一个类具有main方法

时间:2013-08-10 20:23:40

标签: java class classloader access-modifiers

我在玩游戏时遇到了这种奇怪的情况:-)

Java的文档指定文件可以包含所有非公共类,并且文件名不匹配任何类。当编译后尝试运行时,即使在指定了main方法的一个类之后,它也会生成Exception。需要解释如何执行此文件的main方法。

我的测试代码在名为 NoPublicClasses.java 的文件中如下:

class Class1{

}

class Class2{
public static void main(String[] args){

}

}

它汇编得很好。但是如果你试图运行它会抛出异常。您可以在下面查看我尝试的内容

java NoPublicClasses  

对于上面我预期的异常,它发生了我的预期,但是当我做了

java Class2

它也引发了意想不到的异常。所以我需要一些善意的人来解释原因,或者如果没有更改访问修饰符和文件名或类名,有任何解决方案,请告诉我。

谢谢和问候。

2 个答案:

答案 0 :(得分:2)

执行java Class2时不应该得到异常。我只是尝试了它并且它起作用了:

package tests;

class Class1 {
}

class Class2 {
    public static void main(String[] args) {
        System.out.println("Up and running");
    }
}

在命令行控制台中:

java tests.Class2
Up and running

答案 1 :(得分:1)

你的第二个例子应该正常工作。确保您正在执行正确的类(即不要将其与文件名混淆)。引用表格JLS specification -section 1.2. Example Programs

  

文中给出的大多数示例程序都可以执行,并且形式类似于:

class Test {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++)
            System.out.print(i == 0 ? args[i] : " " + args[i]);
        System.out.println();
    } 
}
  

在安装了Oracle JDK的计算机上,可以通过提供命令来编译和执行存储在Test.java文件中的此类:

javac Test.java 
java Test Hello, world.
  

产生输出:

Hello, world.

JLS使用顶级类不公开的程序。并且我能够运行上面描述的上述示例。我使用了名为AAA.java的文件名,但在编译时会生成Test.class