3

我会尽量回答两个,如果我错了,请纠正我:

其中: 如果使用Classname .method() 或使用反射调用静态方法,那么即使更改调用方法的返回类型也没关系,仍然会调用相同的方法。

所以 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 抛出

公共静态int main(String[] args) { return 1;
}

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

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

4

2 回答 2

3

据我所知, Java 中main返回的原因void是线程。

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

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

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

于 2010-03-12T12:57:56.997 回答
0

至于“为什么”:

我记得在过去的 Mac(OS 7 左右)上,Mac JVM 会接受static void main()没有任何参数的 a(因为 Mac 没有命令行)。现在已经没有了。

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

于 2010-03-12T07:33:17.693 回答