Java初学者关于主方法中String [] args的问题

时间:2010-05-21 19:57:17

标签: java main

所以我只是尝试从String[]方法

中排除main args

编好了!

但JVM正在显示异常

为什么每次都要包含String[] args时它会编译?

这里发生了什么?为什么不显示编译错误?

输入这个让我觉得编译器可能没有把它看成是main方法..是这样的吗?

如果是这样的话......为什么不呢?我的意思是,不应该只有一个主要的方法必须有String[] args作为参数吗?

13 个答案:

答案 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)
     

修饰符publicstatic可以按任意顺序编写(public staticstatic public),但惯例是使用public static,如上所示。您可以根据需要为参数命名,但大多数程序员选择“args”或“argv”。

     

main方法类似于C和C ++中的main函数;它是您的应用程序的入口点,随后将调用您的程序所需的所有其他方法。

确切地说, main方法由Java定义为应用程序入口点。并非所有内容都是应用程序,并非每个main方法都是应用程序入口点。例如,小程序不需要main,因为它是以不同的机制开始的。

另请注意,自引入varargs以来,您实际上可以按如下方式声明应用程序入口点:

 public static void main(String... args)

这是有效的,因为在语法糖的下面,Java中的varargs被实现为数组。

另见

相关问题

答案 12 :(得分:0)

重点:

  1. 以下是主要方法的签名:

    public static void main(String[] args)
    
  2. 主要方法可以重载。

  3. 多个类可以在单个编译单元中包含main方法(所以它们都将被称为可执行类)

  4. 包含主要方法的类可能是也可能不是公开的。

  5. 错误地,如果您要省略static关键字(或者签名有任何不同),编译将会完成,但会发生运行时错误。

  6. 来自我的博客:

    Java: Important points about the main method