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