2010-01-15 27 views
11

In Bezug auf C/C++ muss main() immer eine ganze Zahl zurückgeben (Null um Erfolg anzuzeigen und nicht Null um Fehler anzuzeigen). Ich kann das verstehen, wenn das Programm ausgeführt wird, wird es zu einem Prozess und jeder Prozess sollte einen Exit-Status haben, den wir erhalten, indem wir echo $ machen. aus der Shell, nachdem der Prozess vorüber ist.Hauptfunktion gibt nichts zurück. Warum?

Jetzt verstehe ich nicht, warum die Hauptmethode nichts in Java zurückgibt? Hat es etwas damit zu tun, dass das Programm auf JVM läuft und der JVM-Prozess für die Rückgabe des Exit-Status zuständig ist?

Bitte klären Sie.

Danke,
Roger

Antwort

14

Wenn das Hauptverfahren einer Single-Threaded-Java-Anwendung endet, wird die Anwendung mit Exit-Code beenden 0. Wenn Sie einen anderen Exit-Code benötigen, vielleicht um einen Fehler anzuzeigen, können Sie

platzieren
System.exit(yourNumberHere); 

irgendwo im Code (besonders außerhalb der Hauptmethode).

Dies ist bei Multi-Thread-Anwendungen anders, wo Sie entweder System.exit von innen von kill -9 von außen verwenden müssen, um die JVM zu stoppen.

Hier ist ein kurzes Beispiel, wo Beendigung der Haupt die Anwendung nicht mehr (ein typischer Dienst oder Daemon Verhalten):

public static void main(String args[]) { 
    Thread iWillSurvive = new Thread(new Runnable() { 
    public void run() { 
     while(true) { 
     // heat the CPU 
     } 
    } 
    }); 
    iWillSurvive.start(); 
} 

Bemerkung: Sicher, ein Thread wird beendet, wenn es Verfahren laufen gelassen (oder die Hauptmethode im Fall des Hauptthreads) beendet. Und in diesem Fall, wenn alle Threads beendet sind, wird die JVM mit dem Exit-Code 0 enden (was uns zurück zur Anfangsfrage bringt). Hoffe, dass alle jetzt glücklich sind.

+0

Sie meinen, wenn ich kein System.exit() in meinem Programm habe, wird JVM es mit 0 hinzufügen. Und wenn mein Programm einen expliziten Aufruf mit einem Wert ungleich Null hat, wird es als Exit verwendet Status? – gameover

+0

Der Java-Prozess wird _not_ nicht notwendigerweise beendet, wenn die Hauptmethode beendet wird, wodurch es (wie kai1968 angibt) unangemessen ist, den Exitcode des Prozesses von der Hauptmethode zurückzugeben. – jarnbjo

+0

Immer noch falsch. Es ist nicht notwendig, Tools wie kill oder System.exit zu verwenden, um eine Multithread-Java-Anwendung zu stoppen. Hinweis: Selbst die einfachste Java-Anwendung "Hello World" ist mutlithreaded (die Java-VM startet ihre eigenen Threads für verschiedene Verwaltungsprobleme) und wird beendet, wenn die Hauptmethode abgeschlossen ist. – jarnbjo

7

Java hat System.exit(int) für diesen Zweck.

Im Grunde wird ein Java-Programm mit dem Exit-Code 0 enden, wenn der Programmfluss das Ende der Hauptmethode erreicht (ungefähr; es wird mit Swing und Threading seltsamer, aber das sollte ausreichen).

Wenn Sie irgendwo einen Anruf an System.exit() (irgendwo, eigentlich) oder Runtime.getRuntime().exit() was System.exit() fordert, dann endet das Programm sofort und vorzeitig.

Sie könnten es sich vorstellen, wie Java am Ende der Hauptmethode implizit System.exit(0) hinzufügen würde, aber es könnte subtilere Unterschiede geben. Ich habe jetzt aber nicht die kompletten Details des JVM-Shutdowns in meinem Kopf.

+0

Wir schreiben das nicht am Ende jedes Java-Programms, oder? – gameover

+0

Wenn Sie nicht unnormal zurückkehren möchten, Nein. Der implizite Beendigungscode ist wie üblich "0". – Joey

+0

Sie wollen sagen, wenn ich kein System.exit() in meinem Programm habe, wird JVM es mit 0 addieren. Und wenn mein Programm einen expliziten Aufruf mit einem Wert ungleich Null hat, wird es als Exit verwendet Status? – codaddict

0

Möglicherweise könnte es sein, weil System.exit(int exitCode) keinen Wert zurückgegeben hat.

+0

Ich habe den vorhandenen Beitrag nicht als Antwort gesehen, also habe ich den Beitrag so bearbeitet, dass er eher eine Antwort als eine Frage ist. –

16

Entwickelt, wenn Multi-Threading bereits eine allgemeine Sache war, sagte Java (von Entwurf) "Auf Wiedersehen" zu der Idee, dass, wenn "Main" zurückkehrt, das Programm fertig ist. Deshalb gibt es keinen Rückgabewert. Wie die anderen sagten, verwenden Sie System.exit, wenn Sie mit Rückkehrcode beenden möchten.

+0

Das ist so ziemlich alles auf den Punkt gebracht. – McDowell

+0

+1 große Erklärung :) – atv

4

A minor niggle - in C++, Sie brauchen nichts von Haupt zurück:

int main() { 
} 

ist ein völlig legales C++ Programm - es wirkt, als ob Sie hatte:

return 0; 

als die letzte Aussage in main.

+0

Ich kam hierher, um dies zu sagen. Es überrascht mich immer, dass der Standard nicht verlangt, dass du in diesem Fall zurückkehrst, und in der Tat darfst du es nicht so erklären. Aber so funktioniert es – jcoder

0

Ich vermute, dass der Grund für C/C++, das int zurückgibt, ist, weil das die Konvention ist, um Funktion/Methode/Programm Erfolg/Fehler in diesen Sprachen anzuzeigen.

Mit der Einführung von Ausnahmen in Java, anstelle von Null für Erfolg und Nicht-Null-Werte für Fehler, verwendet es eine Ausnahmehierarchie für Fehler, und Erfolge waren einfach, wenn keine Ausnahmen geworfen wurden, so dass die Notwendigkeit einer Rückkehr entfällt Wert.

+0

Außer dass eine Ausnahme von 'main()' zu werfen, wird nicht sinnvoll sein, und die einzige Ausgabe muss ein Return-Code sein. Die Tatsache, dass C keine Ausnahmen in einem C-Programm unterstützt und Java in einem Java-Programm keinen Einfluss darauf hat, wie diese mit dem Betriebssystem interagieren. –

0

Die meisten Programme, die ich in diesen Tagen schreibe, haben irgendeine Form von Benutzerschnittstelle und wenig, dass sie nützlich zurückgeben könnten, und noch weniger wahrscheinlich, dass irgendetwas jeden diesen Statuscode benötigen würde.

Warum also alle Programme zwingen, eins zurückzugeben? Wie andere gesagt haben, können Sie einen Statuscode zurückgeben, wenn Sie möchten ...

+0

Was zwingt Programme, einen Statuscode zurückzugeben? –

1

Exit-Wert ist nützlich für Skripting wie Bash-Skript oder Befehlszeilenoperationen. Verwenden Sie in diesen Fällen System.exit().