Java Puzzler-是什么原因?

时间:2013-06-12 12:42:15

标签: java string compilation main puzzle

我写了以下代码。

class String { 

    private final java.lang.String s; 

    public String(java.lang.String s){ 
        this.s = s; 
    } 

    public java.lang.String toString(){ 
        return s; 
    } 

    public static void main(String[] args) { 
        String s = new String("Hello world"); 
        System.out.println(s); 
    } 
}

当我执行它时,得到以下错误

The program compiled successfully, but main class was not found.
  Main class should contain method: public static void main (String[] args).

为什么会这样?...虽然主要方法被定义为什么系统没有读取/识别它?

4 个答案:

答案 0 :(得分:6)

  

为什么会这样?

因为此时使用的String[]不是java.lang.String[]。它是您在此处定义的String类的数组。因此,您的IDE(或其他任何东西)正确地告诉您main方法作为有效入口点。

课程:不要使用与常用类名相同的类名。它使您的代码非常混乱。在这种情况下,令你感到困惑,以至于让自己感到困惑!

答案 1 :(得分:6)

public static void main(String[] args) {

因为你必须使用java.lang.String,而不是你自己的String。在您的主要方法中,您使用的String实际上是已定义的自定义java.lang.String,而不是真正的class MyString { private final String s; public MyString(String s){ this.s = s; } public String toString(){ return s; } public static void main(MyString[] args) { // <--------- oh no! MyString s = new MyString("Hello world"); System.out.println(s); } }

这是代码,澄清了一点:

{{1}}

因此,您可以从这个难题中学到的教训是:不要将您的课程命名为其他常用课程!

答案 2 :(得分:2)

因为main方法的签名必须是

public static void main(java.lang.String[] args) { 

而不是

public static void main(mypackage.String[] args) { 

通常,隐含java.lang。在这种情况下,会使用您的个人String。这就是为什么你应该永远将你的类命名为java.lang

中已有的类

答案 3 :(得分:2)

问题是您的类名为String,类似于Java的String类。这真的很糟糕,你不应该这样做。

因此,当你写下main的声明:

public static void main(String[] args) { 

String []不是指Java String类,而是你自己的类,所以java找不到它。

如果您希望java能够找到它,您必须写:

public static void main(java.lang.String[] args) { 

但实际上,这不是你想要的,为你的班级找到另一个名字。