JVM检查入口方法main(String args )的返回类型是否为空而不是其他任何内容的原因和原因?

我会尽力回答这两个问题,如果我错了,请纠正我:

其中:如果使用Classname .method()或使用reflection调用静态方法,则即使更改调用方法的返回类型也无关紧要,仍将调用相同的方法。

因此JVM可能会在jvm.cpp的一个本机方法中检查它

methodHandle m(THREAD,init_klass-> find_method(vmSymbols :: object_initializer_name(),> vmSymbols :: void_method_signature() ));

if(m.is_null()){—— THROW_MSG_0 ……… ..

原因:虽然从main返回一个值是没用的,因为java不对它做任何事情,但是如果我们尝试将main的返回类型更改为int,例如,JVM抛出

public static int main(String [] args){return 1;
}

java.lang.NoSuchMethodError:线程“main”中的主要exception

因此,Java可能要求对入口方法main()使用相同的签名来保持所有Java程序的对称性

从我可以收集到的, main在Java中返回void的原因是线程。

C和C ++都是在multithreading是一个常见的习惯用法之前设计的,而线程是Java概念中不可或缺的一部分。 在任何类型的非平凡(multithreading)程序中,都有多个线程,因此实际上您的程序永远不会从main的开始到结束线性运行。

由于JVM在所有非守护程序线程完成运行之前不会暂停执行,因此从main方法返回并不意味着程序已结束。

考虑到这一点, void确实似乎是最适合主要的返回类型。

至于“为什么”:

我记得在Mac的旧时代(OS 7左右),Mac JVM会接受一个没有任何args的static void main() (因为Mac没有命令行)。 那已经过去了。

我认为严格和毫不含糊的行为是有益的。 否则,你最终会得到一些在某些平台上运行的程序,而不是出于其他原因而非其他原因。 正如您所指出的,无论如何都会丢弃main任何返回值。