Java初学者关于主方法中String args的问题
所以我只是尝试从main
方法中排除String[]
args
它汇编好了!
但JVM正在显示exception
为什么每次都包含String[]
args时它会被编译?
这里发生了什么 ? 为什么不显示编译错误?
打字这让我觉得可能是编译器没有看到它作为main
方法..是这样的吗?
如果是这样的话……为什么不呢? 我的意思是不应该只有一个主要的方法必须有String[]
args作为参数?
打字这让我觉得可能是编译器没有看到它作为主要方法..是这样的吗?
正确。 没有编译错误,因为您可以完全自由地使用名为main
各种方法。 但是当你启动JVM并给它一个“主类”时,它会在该类中寻找一个方法static public void main(String[])
,如果它没有找到这样的方法,它将以exception中止。
这允许您在程序中拥有多个主要方法,并且如果您考虑它,它实际上是唯一有意义的:应用程序可以由来自不同来源的类和JAR文件组成,由不同的人在不同时间编写,因此在许多情况下,你从一开始就不能真正拥有一个指定的“主类”。
JVM正在寻找一种非常特殊的主要方法来运行。 只有签名
public static void main( String[] args )
找到了。 名为main
所有其他方法只是“正常”方法。
并非每个类都必须有一个public static void main(String[] args)
方法,只有你想要从JVM运行的方法。 结果是,如果找到public static void main()
,你的类将编译时没有错误,但如果你尝试用JVM运行它会抛出exception,因为它找不到程序的入口点。
底线程序的入口点必须是public static void main(String[] args)
,它必须位于至少一个.java文件中。
请注意,您的代码中可以有多个public static void main(String[] args)
方法(每个类一个),优点是您可以使用这些方法单独测试和调试类。
为了尝试回答“为什么没有适当的主方法进行编译是合法的”,这是因为不是每个java项目都是可以运行的独立应用程序。 有些只是库,其他程序会将它们包含在jar文件中并使用它们的代码,但它们不会自行“运行”。 其他可能是Web应用程序,它们被部署到已经启动的Web服务器上,只有服务器本身实际上具有适当的“主”方法。 Web应用程序项目由它打开并执行。
编译器在编译时并不真正知道您打算尝试将代码作为应用程序的代码运行。
Java支持方法重载。 这意味着您可以使用多个具有相同名称但不同参数的方法。
话虽如此,当你运行java ClassName
,Java会在ClassName.class
查找带有签名public static void main (String[])
(它不关心String[]
变量的名称)并运行它。 如果找不到,Java会弹出以下exception:
线程“main”中的exceptionjava.lang.NoSuchMethodError:main
你是对的。 运行时正在寻找一个将字符串数组作为参数的主方法,而不是找到它。
你有一个不带字符串数组的main方法的事实是无关紧要的。 就像任何其他方法一样,您可以创建具有不同参数的main()
多个版本 – 运行时将忽略它们。
这不是超载吗? 定义方法是完全合法的
static void main() { }
这不是JVM将要寻找的切入点。
重载是指具有相同名称但不同参数的多个方法的能力。 实际上,编译器根据方法名称和参数创建名称。
因此,对于编译器,将调用main(String []),类似于main_String_arr,而main()将被称为main。
你可以有许多名为main的方法,但只有一个可以是主要的 – 程序的入口点。 它是String [] args的那个。
它仍然是一种有效的方法。 例如,如果您需要,可以使用带有int参数的名为“main”的静态方法:
public static void main(int foo){}
编译器没有抱怨,因为它是一个有效的方法! 只是,为了运行Java程序,Java寻找一个名为“main”的静态方法,其中包含一个String数组参数。
是..
Java编译器将查找相同的方法签名 ,将其视为main
编写具有相同名称但具有其他参数的任何函数将导致重载函数。
重载function不一样.. !!
C#中的情况有点不同..
最后,你必须确保你的主要是这样的:
public static void main(String[] args)
您可以使用编译器来编译应用程序的一部分 :例如,制作一个jar文件,您将从应用程序的另一部分调用该文件; 或者以不同方式启动的applet。 因此编译器不能抱怨缺少main(String [])方法。 但是试图运行这样的编译结果。
当你尝试运行这样的编译结果时,java总是在寻找一个特定的main(String []); 如果它找不到它会抛出运行时exception。 用于启动应用程序的主要文件必须具有该签名。
以下是Java Tutorials / Getting Started的引用:
在Java编程语言中,每个应用程序都必须包含一个main方法,其签名是:
public static void main(String[] args)
public
和static
修饰符可以按任何顺序编写(public static
或static public
),但惯例是使用public static
如上所示。 您可以根据需要为参数命名,但大多数程序员选择“args
”或“argv
”。
main
方法类似于C和C ++中的主要function; 它是您的应用程序的入口点,随后将调用您的程序所需的所有其他方法。
所以准确地说, main
方法是由Java定义为应用程序入口点。 并非一切都是应用程序,并非每个main
方法都是应用程序入口点。 例如,Applet不需要main
,因为它是以不同的机制开始的。
另请注意,自引入varargs以来,您实际上可以按如下方式声明应用程序入口点:
public static void main(String... args)
这是有效的,因为在语法糖的下面,Java中的varargs被实现为数组。
也可以看看
- Java教程/入门/ Hello World
- Java教程/命令行参数
- Java语言指南/ Varargs
相关问题
- 为什么Java
main
方法是static
? - 有可能超载
main
方法吗? - 为什么java中的
main()
是void
? - 为什么applet不需要
main()
? - Java应用程序的入口点:
main()
,init()
或run()
?
重点:
-
以下是主要方法的签名:
public static void main(String[] args)
-
main方法可以重载。
-
多个类可以在单个编译单元中包含main方法(所以它们都将被称为可执行类)
-
包含主要方法的类可能是也可能不是公开的。
-
错误地,如果您要省略static关键字(或签名以任何方式不同),将完成编译但会发生运行时错误。
从我的博客:
Java:关于main方法的重点