Wozu nutzt man in der Main Methode das args Array?

Nacer5

Mitglied
Ich habe verstanden das man das Array von args über den Aufruf in der Konsole Parameter übergeben kann. Aber zum Verständnis, wann macht man das?
 
Ein sehr weit verbreiteter Use-Case, ist das in Windows bekannte "Öffnen mit" einer Datei mit einem bestimmten Programm. Hier wird der Pfad zur Datei die geöffnet werden soll als Parameter in diesem Array dem Programm übergeben.
 
Als Beispiel, eine Jar Datei startet man mit
Java:
java -jar meinProgramm.jar

Wenn die Java.exe jetzt auch als Java Programm geschrieben wäre, dann sehe beim Start das args-Array wie folgt aus:

Code:
args[0] = "-jar"
args[1] = "meinProgramm.jar"

Und dann könnte das Programm daraus ableiten, dass es die Jar Datei meinProgramm.jar laden und starten soll.
 
Ein anderer Use-Case sind eben CLI (Command-Line-Interface) Programme:
Du willst, dass das Programm eine bestimmte Funktionalität ausführt und rufst es nicht per GUI auf, sondern eben per Kommandozeile.
Hier brauchst du dir nur _jedes_ Linux Kommandozeilen Tool anschauen (ls, cp, mv, zip, tar, more, less, ...). Alle diese Tools bekommen Kommandozeilenargumente, um z.B. Pfade zu Dateien anzugeben, auf denen sie arbeiten sollen. Solche Tools kannst du ja theoretisch auch per Java bauen (gut, musst sie halt mit `java -jar tool.jar <cmd-args>` aufrufen).
 
Ok, das klingt logisch. Mich hatte verwirrt, das hier in meinem Beispiel die Argumente "erstesArgument" "2.0" und "drittesArgumente" übergeben wurden. Aber das mit dem Öffnen von Dateien macht sicherlich Sinn. Danke!
 
Ja, da hat Java so ein bisschen verschlafen, was Usability/Simplicity für CLI Tools angeht. Da ist die Welt bei C und mittlerweile vermehrt bei Go angelangt. Und aktuell habe ich der JVM Plattform auch ein bisschen den Rücken gekehrt im aktuellen Projekt und mich in Go/Golang eingearbeitet. Was für ein cooler Shit das ist. Ebenfalls mächtige Standard-Library, keine Magie (vergl Java: Spring/Spring Boot, Definieren von Klassen zur Laufzeit), ebenfalls Garbage Collector, kein JIT, aber viiiieeel geringerer Speicherverbrauch. Da ist ein Go-Microservice mit REST Interface und Datenbankanbindung und liegt bei ca. 10 MB RSS und seine noch-Java/JVM-Kollegen sind da mit weit über 700MB RSS dabei. Aber das nur am Rande. 🙂
 
Das args-Array ist auch inkonsistent zu System.exit, welches das return int der main-Methode einspart.

Besser wäre wahrscheinlich ein String[] System.getArgs() gewesen.

System.exit(0) spart nicht den return-Wert der Main-Methode ein. Der Befehl kann nämlich von überall im Programm aus aufgerufen werden. Würde nur die Main-Methode einen Rückgabewert haben, müsste man auch immer wieder dorthin zurückkehren, bevor das Programm geschlossen wird und das passiert eben nicht. Der Befehl hat mit der Main-Methode nichts zu tun.
 
System.exit(0) spart nicht den return-Wert der Main-Methode ein.


Das args-Array ist auch inkonsistent zu System.exit, welches das return int der main-Methode einspart.
Das args-Array ist auch inkonsistent zu System.exit, welches das return int der main-Funktion in C einspart.



What should main() return in C and C++? The return value for main is used to indicate how the program exited. If the program execution was normal, a 0 return value is used. Abnormal termination(errors, invalid inputs, segmentation faults, etc.) is usually terminated by a non-zero return.
 

Zurück
Oben