我想知道为什么只有java中的main方法的void返回类型。
public static void main(String [] args)
为什么除main for void方法之外没有其他返回类型。
由于
答案 0 :(得分:28)
简短的回答是:因为这就是language specification所说的。
在当今常用的操作系统(Windows和Unix系列)中,进程中唯一的“返回值”是exit status,这是一个较小的数字(通常是8位)。可以使用System.exit(int)
方法从Java程序返回此值:
public static void exit(int status)
终止当前运行的Java虚拟机。该参数用作状态代码;按照惯例,非零状态代码表示异常终止。
答案 1 :(得分:25)
你期待什么回来?
在C中,您通常会返回int
退出代码。但是,在多线程系统中,这没有多大意义。通常,Java程序将启动许多线程。主线程通常会或多或少立即返回。
System.exit
可用于退出特定的退出代码。
答案 2 :(得分:2)
这似乎是一个随意的决定,可能考虑到并非所有操作系统都是unixy,因为它们允许程序返回退出代码。
可以使用int
中的main
返回代码将C指定为C。多线程并不重要,因为只有一个线程最初启动main,它的返回值可能是JVM返回给OS的那个,无论其他线程何时返回以及它们做什么。
这是牵强附会但如果有人构建了一个可以运行多个Java程序的JVM,每个程序都有自己的main
,那么它可以设计为返回上一个main
返回的值来调用
最合理的理由是JVM本身可能需要返回一个退出代码,原因是它自己的原因,然而,这个基本原理是由System.exit(int)
提供的,它恰好覆盖了JVM的回报。码。鉴于此,没有理由同样允许main
返回int
,就像main
做的最后一件事System.exit(n)
总而言之,听起来像是一个武断的决定。
答案 3 :(得分:1)
首先,因为没有什么可以返回值。主流操作系统(例如Windows,UNIX,Linux等)不允许命令“返回”值。 (虽然可以说,退出代码是一个返回值,但它仅限于一个整数,并且存在各种特定于操作系统的警告;例如,有多少位可以来自应用程序。)
其次,因为Java不允许重载仅在返回类型上有所不同的方法。
第三,正如@Tom所指出的那样,如果exit code
是main
的返回值,那么处理调用System.exit(rc)
的其他线程将会很困难。
答案 4 :(得分:0)
Java指定应用程序入口点必须为public static
,名为main
,返回void
,并将String[]
作为参数。这就是它的方式。
那就是说,你可以在技术上定义一个不符合这些标准的main
方法,但它们将不是一个有效的应用程序入口点
public class MainMain {
public static void main(String args[]) { // application entry point
System.out.println(main());
}
private static String main() { // just a method named main
return "Hello world!";
}
}
您应该仅为有效的Java应用程序入口点保留main
,但没有什么可以阻止您编写上述代码。
答案 5 :(得分:0)
因为您从JVM Hello.main
运行main,所以我们无法将值返回给JVM。它只是给出了运行时异常。
答案 6 :(得分:0)
合理的中间方式(在具有void签名,但也需要向OS返回值)之间似乎是:在main中为所有与错误对应的返回值抛出运行时异常,该异常中的适当消息。
当然,这有助于区分操作系统级别的错误和非错误退出(例如,shell脚本等),但在许多情况下,实际上只需要这一切,并且可能是最常见的用途这些环境回报值;如果此命令失败,则运行或不运行下一个命令。