5

我写了以下代码。

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

4 回答 4

6

为什么会这样?

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

教训:不要使用与常用类名相同的类名。它使您的代码非常混乱。在这种情况下,如此混乱以至于您自己都感到困惑!

于 2013-06-12T12:46:01.400 回答
6
public static void main(String[] args) {

因为你必须使用 a 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); 
    } 
}

所以,你可以从这个谜题中学到的教训是:不要将你的类命名为其他常用类!

于 2013-06-12T12:46:24.600 回答
2

因为main方法的签名必须是

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

并不是

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

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

于 2013-06-12T12:47:17.403 回答
2

问题是你的类是命名String的,就像StringJava 的类一样。这真的很糟糕,你不应该这样做。

因此,当您编写 main 的声明时:

public static void main(String[] args) { 

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

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

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

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

于 2013-06-12T12:49:20.620 回答