2012-10-31 11 views
6

Ich untersuche eine Möglichkeit, meine Java-Anwendung neu zu starten, indem ich auf eine Schaltfläche in der GUI klicke. Ich suchte im Internet und stieß auf main (new String [0]). Ich muss verstehen, ob dies eine gültige Möglichkeit ist, meine Anwendung neu zu starten. Kann mir jemand bitte Danke sagen.Kann ich main() verwenden, um meine Anwendung neu zu starten?

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) { 

    main(new String[0]); 
    } 

Bearbeiten Wäre das besser?

+0

Wenn die GUI Ihrer App noch aktiv ist, wird die App bereits ausgeführt. –

Antwort

0

main() ist eine Funktion, die Sie in dieser Klasse definiert haben.
Es dauert ein einzelnes Argument vom Typ string[].

Diese Zeile ruft diese Funktion auf, genau wie jede andere Funktion auch.
Es geht einen leeren String Array (new String[0])

Da Ihr main() Funktion Ihre Anwendung beginnt, wird dies es „neu starten“.

Es werden jedoch keine statischen Zustände zurückgesetzt.

13

Es ruft die statische Methode main mit einem leeren String-Array auf. Sehen Sie, wenn das macht es noch klarer:

String[] args = new String[0]; // Or String[] args = {}; 
main(args); 

Zugegeben, es ist ungewöhnlich, dass ein main Methode von nicht-main-Methode zu nennen ... und das wird nicht wirklich „Neustart“ der Anwendung. Es wird es von innerhalb Ihres vorhandenen Handlers nennen, der böse Folgen haben kann. Ich würde es nicht empfehlen.

Wenn Sie einen Weg zu einem völlig sauberen Prozess erarbeiten können, wäre das ein wesentlich zuverlässigerer "Neustart".

3

Dies ist kein guter Weg, um Ihre Anwendung neu zu starten, weil der erste Aufruf Ihrer Anwendung noch ausgeführt würde. Wenn Sie Ihre Anwendung so oft "neu starten", erhalten Sie einen Stapelüberlauf.

Wenn Sie müssen Ihre Anwendung neu starten, ohne es zu beenden (was ungewöhnlich ist), können Sie einen try/catch Block in Ihrem main, legen eine Schleife um ihn herum, und weiterhin die Schleife einrichten, wenn Sie eine Ausnahme erhalten. Zugegebenermaßen ist dies eher eine Problemumgehung als alles andere, da es Ausnahmen verwendet, um den "normalen" Programmablauf zu steuern.

+0

Bitte starten Sie eine Anwendung nie wie folgt neu. Der richtige Weg, um eine Anwendung neu zu starten, besteht darin, einen neuen Java-Befehl mit dem notwendigen Classpath/Optionen Ihres Programms auszuführen. – Vulcan

+0

Das ist ein hässlicher Neustart. –

+0

@Vulcan Zugegeben, dies ist eine Lösung des letzten Ausweges, die an den Hack grenzt. Ich habe meine Antwort bearbeitet, um es klarzustellen. – dasblinkenlight

7

Sie werden nicht in der Lage sein, Ihre Anwendung neu zu starten, ohne die JVM zu verlassen - die JVM wird Objekte, Threads usw. zugewiesen haben und ohne viel Aufwand werden Sie dies nicht einfach wegwerfen.

Ich denke, ein einfacherer Weg besteht darin, Ihre Anwendung in ein Skript zu verpacken und das Skript dazu zu bringen, Ihre App neu zu starten, wenn sie mit einem bestimmten Beendigungscode beendet wird. Auf diese Weise können Sie Ihre JVM vollständig über einen System.exit()-Aufruf löschen. Wenn das Skript Ihre App nur neu startet, wenn ein bestimmter Beendigungscode angezeigt wird, können Sie das Programm beenden oder beenden und neu starten.

z.B. Schau dir die JavaServiceWrapper an. Dies bietet die Möglichkeit, eine Java-Anwendung mit bestimmten Config/Parametern zu starten und das Verhalten von restart zu steuern. Beachten Sie, dass in Ihrer Anwendung ein particular API call to invoke a restart bereitgestellt wird.

1

Wie Sie das gelesen haben.

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) { 

    main(new String[0]); 
    } 

Was es tut, ist auf bnnewsaleActionPerformed es Haupt ruft() mit einem leeren neuen String.
Das startet Ihre Anwendung nicht neu.

Um neu zu starten, stoppen und neu starten.

Während mit Ihrem Code, wird es Ihre Anwendung erneut innerhalb der aktuellen Anwendung starten.
Eine Art wie verschachteln und es wird böse Effekte zum Beispiel haben: keine statischen Zuordnungen zurücksetzen.

0

Hier ist ein konkretes Beispiel dafür, was @Brian Agnew bereits oben vorgeschlagen hat.

In Sie Java-Code, Ausgang mit einem bestimmten Ausgang für den Fall eines Neustarts

if(restart){ 

System.exit(5); 

}else{ 
System.exit(0); 
} 

Jetzt ein Skript erstellen, die tatsächlich verwendet wird, Ihre Anwendung zu treten beginnen. Ich gebe hier ein Beispiel für Windows-Batch-Skript, aber Sie können ähnliche Skripte für andere OS arbeiten.

Die Batch-Datei:

@echo off 

:start 

java Test %1 
set exitcode=%ERRORLEVEL% 

if %exitcode% == "5" (goto :start) 

Beim Verlassen mit dem Statuscode von 5 (es irgendeine ganzen Zahl sein kann), dann Batch Sie das Programm neu starten (Test ist die Beispiel-Klasse, die Haupt hat Methode)

0

Es gibt nichts besonderes über die Hauptmethode in Java, also unterscheidet sich das Aufrufen von main nicht von dem Aufruf einer anderen Methode. Jedes Bit der jvm-Initialisierung passiert, bevor die Java-Laufzeit nach der Methode namens "main" sucht.

Wenn Sie Ihre Anwendung neu starten möchten, ohne die jvm zu beenden, müssen Sie jedes statische Status vermeiden oder bereinigen. In einfachen Fällen können Sie einfach eine Klasse schreiben, um die Lebensdauer Ihrer Anwendung zu verwalten und eine neue Instanz für einen Neustart zu erstellen.

class MyApplication{ 
    public void start(){}//setup all application state and run it 
    public void shutdown(){}//close all Windows/Connections and Threads 
} 

Für nicht trivial Beispiele dieser hässlichen ThreadLocals/statische Variablen bekommen/Dateien markierten beim Beenden löschen müssen gepflegt werden. Auch Aktualisierungen von Anwendungsklassen sind nur bei einigen Klassenlader-Tricks sichtbar.

Verwandte Themen