【发布时间】:2015-06-30 05:28:41
【问题描述】:
虽然返回类型不是方法签名的一部分,但 JVM 会寻找确切的声明为
public static void main(String[] args)
我的假设是,由于方法签名没有包含“返回类型”,所以我必须是 允许更改返回类型。
但如果我将其更改为public static int main(String[] args) 并返回一个值让我们说 0,JVM 无法执行程序并退出并出现错误
Error: Main method must return a value of type void in class TestData, please
define the main method as:
public static void main(String[] args)
为什么 Java 规范只希望 main 方法为 void? 当返回类型不是方法签名的一部分时,为什么会有这个限制?
这个问题与Why is main() in java void? 不同:这个问题已关闭,因为它是基于意见的,而我正在寻找 JVM 调用此方法的代码位置/进程,以及迫使他们这样做的限制是什么保持此方法无效。他们做出了哪些设计决策(以及背后的原因),记录在哪里。
我正在寻找事实,以便知道这样做的原因。 请不要在未仔细阅读问题详细信息的情况下将其标记为重复。
PS:退出,是另外一回事。我更关心程序的进入。另外,返回的值可能不是给JVM使用的,限制为void,限制了可扩展性。
到目前为止,我从这个问题中学到的是:Java 规范已明确固定返回类型,以避免对可能期望此值返回到 OS 的迁移程序员 (C/CPP) 造成混淆,但由于 JVM 介于两者之间值永远不会返回给操作系统。为了这个特殊目的(向操作系统返回值),他们提供了 System.exit() 方法。
对于那些建议返回类型是签名的一部分的人——尝试在一个类中定义以下两个方法
public static void main(String[] a){
}
public static String main(String[] a){
}
你会得到一个编译错误,因为这两个方法的签名是一样的。
【问题讨论】:
-
JVM 这样做是因为规范是这么说的,但我假设你想知道为什么规范这么说。
-
我的问题还没有回答!!为什么!!!没有人在谈论“为什么”是不允许的。每个人都将其标记为重复或回答这是“应该如何”。我的问题是“为什么”。在您回答我的确切问题之前,请删除此重复标记。
-
@CodeFighter 您似乎遇到的问题是,您不能接受“这就是它的设计方式”的答案,创作者决定将主要入口点设为@987654326 @。这可能有很多原因,您需要一台时间机器和一个读心器来获得答案。
-
@CodeFighter
main有任何返回值几乎没有意义,因为当main无论如何存在时JVM 可能不会退出,保证在调用System.exit或唯一运行时退出Threads 是守护线程,那么,返回一个可以忽略或更改的值有什么意义? -
@CodeFighter 这是真的,但一般来说,它就是为此而设计的。 JVM 在方法签名上放置了一个 required ,它形成了我们有义务遵守的合同。这就像说为什么你不能改变接口方法的返回类型,语言规范禁止它。
标签: java jvm return-type