3

私は両方に答えようとします。間違っている場合は修正してください。

場所: Classname .method() またはリフレクションを 使用して静的メソッドが呼び出されている場合、呼び出し元のメソッドの戻り値の型を変更しても、同じメソッドが引き続き呼び出されます。

したがって、JVMはおそらくjvm.cppのネイティブメソッドの1つでこれをチェックします

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」でのメイン例外

そのため、Java は、記述されたすべての Java プログラムで対称性を維持するために、エントリ メソッド main() に同じ署名を使用することを義務付けている可能性があります。

4

2 に答える 2

3

私が収集できることから、Java でmain返される理由voidはスレッドです。

C と C++ はどちらも、マルチスレッドが一般的なイディオムになる前に設計されましたが、スレッドはその概念から Java の不可欠な部分でした。あらゆる種類の自明でない (マルチスレッド) プログラムでは、複数のスレッドが存在するため、実際にはプログラムが main の最初から最後まで直線的に実行されることはありません。

JVM はすべての非デーモン スレッドの実行が完了するまで実行を停止しないため、メイン メソッドから戻ってもプログラムが終了したことにはなりません。

それを念頭に置いて、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 に答える