我写了以下代码。
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).
为什么会这样?...虽然主要方法被定义为什么系统没有读取/识别它?
答案 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) {
但实际上,这不是你想要的,为你的班级找到另一个名字。