陷阱15 无法运行——自定义String导致主方法无效
在Java应用程序中,main主方法是应用程序的入口,Java应用程序就是从main主方法开始执行的,因此Java应用程序必须要有main主方法才能运行,在Java中main主方法的定义如下:
public static void main (String[] args)
说明
从主方法的定义可以看到,除了对主方法进行修饰的public、static和void以外,主方法还有一个String 类型的数组作为该方法的形参,对于这个主方法来说,唯一可以改变的就是形参数组的名称args,其他任何部分都不允许修改,并且String类必须是Java虚拟机提供的,否则就会导致应用程序找不到主方法,从而无法运行应用程序。
在Java应用程序中,将含有main主方法的类称为主类,在进行Java应用程序项目开发时,如果在与主类相同的包中创建的某个类或接口的名称与Java虚拟机提供的String类重名,或在主类中创建的内部类与Java虚拟机提供的String类重名,程序将无法找到main主方法,因为这时main主方法的形参类型String已经不再是Java虚拟机提供的String类,而是开发人员创建的String类,因此会出现找不到主方法的异常。
编程准则:自定义类不要与Java虚拟机提供的类同名
在进行Java程序开发时,总是要自定义很多类,但是在创建自定义类时,类的名称尽量不要与Java虚拟机提供的类同名,否则自定义类将会隐藏Java虚拟机提供的同名类,从而导致程序无法使用Java虚拟机提供的同名类。
下面演示一个由于创建自定义的String类,导致Java虚拟机提供的同名类String被隐藏,最终导致Java应用程序无法运行的例子。
示例:
public class Test { private class String{ } public static void main (String[] args) { System. out. println ("创建成员内部类"); } }
运行本示例,将在控制台显示如图3.10所示的异常信息,提示在主线程main 中没有main方法错误。
图3.10 “无main主方法”异常
说明
上面的示例之所以会显示图3.10所示的异常信息,是由于在Test类中创建了一个成员内部类String,而这个内部String类恰好与Java虚拟机提供的String类同名,所以将Java虚拟机提供的重名类String隐藏了,此时main主方法中使用的就是在Test类中定义的成员内部类String,从而导致示例中的main方法只是一个普通的方法,而不是应用程序的主方法,因为Java应用程序主方法的形参数组必须是Java虚拟机提供的String类型。
为了使本示例能正常运行,可以将示例代码中定义的成员内部类的名称String 改为其他的名称,如改为String_1,这时再运行本示例,程序就可以正常运行了,并能在控制台输出“创建成员内部类”这样的信息。