3.7 Der Einstiegspunkt für das Laufzeitsystem main()
 
In Java-Klassen gibt es – ähnlich wie in C(++) – eine ausgezeichnete Funktion main(), die das Laufzeitsystem in der angegebenen Hauptklasse (oder Startklasse) des Programms aufruft. Die main()-Funktion ist für alle Klassen und in der JVM zugänglich (public) und auf jeden Fall statisch (static) zu deklarieren. Die Methode muss statisch sein, da auch ohne Exemplar der Klasse ein Funktionsaufruf möglich sein soll. Als Parameter wird ein Array von String-Objekten angenommen. In diesem sind die auf der Kommandozeile übergebenen Parameter gespeichert:
public static void main( String args[] )
Stimmt der Kopf der Methode nicht, dann wird diese Funktion nicht als Einstiegspunkt von der virtuellen Maschine erkannt.
Hinweis Im Gegensatz zu C(++) steht im ersten Element des Argument-Arrays mit Index 0 nicht der Programmname, also der Name der Hauptklasse, sondern bereits der erste Programmparameter der Kommandozeile.
|
3.7.1 Kommandozeilen-Parameter ausgeben
 
Eine besondere Variable für die Anzahl der Parameter der Kommandozeile ist nicht vonnöten, da das String-Array-Objekt selbst weiß, wie viele Parameter es enthält. Dem folgenden Programm können wir bei der Ausführung hinter dem Klassennamen noch einen Vornamen auf der Kommandozeile übergeben. Dieser wird dann auf der Standardausgabe ausgegeben. Wir können eine Schleife verwenden, um alle Kommandozeilenparameter auszugeben.
Listing 3.7
LiebtHamster.java
class LiebtHamster
{
public static void main( String args[] )
{
if ( args.length == 0 )
System.out.println( "Was?! Keiner liebt kleine Hamster?" );
else
{
System.out.print( "Liebt kleine Hamster: " );
for ( String s : args )
System.out.format( "%s ", new String[]{ s } ); // TODO: 1.5
System.out.println();
}
}
}
Wir können das Programm auf der Kommandozeile wie folgt aufrufen:
$ java LiebtHamster Raphael Regina Paul Mirjam
3.7.2 Der Rückgabewert von main() und System.exit()
 
Der Rückgabetyp void ist sicherlich diskussionswürdig, da die Sprachentwerfer auch hätten fordern können, dass ein Programm immer einen Statuscode an das aufrufende Programm zurückgibt. Für diese Lösung haben sie sich aber nicht entschieden, da Java-Programme in der Regel nur minimal mit dem umgebenden Betriebssystem interagieren sollen und echte Plattformunabhängigkeit gefordert ist, etwa bei Java in Handys. Für die Fälle, in denen ein Statuscode zurückgeliefert werden soll, steht die Funktion exit(status) der Klasse System zur Verfügung; sie beendet eine Applikation. Die Übergabe an die Funktion nennt sich Statuswert (engl. exit status) und wird an die Kommandozeile zurückgegeben. Der Wert ist für Skriptprogramme wichtig, denn sie können über diesen Rückgabewert auf das Gelingen oder Misslingen des Java-Programms reagieren. Ein Wert von 0 zeigt per Definition das Gelingen an, ein Wert ungleich 0 einen Fehler. Der Wertebereich sollte sich zwischen 0 und 255 bewegen. Unter der Unix-Kommandozeile ist der Rückgabewert eines Programms unter $? verfügbar.
final class java.lang.System
|
|
static void exit( int status )
Ein Aufruf von exit() beendet die aktuelle JVM und gibt das Argument der Methode als Statuswert zurück. Ein Wert ungleich Null zeigt einen Fehler an. Also ist der Rückgabewert beim normalen fehlerfreien Verlassen Null. Eine SecurityException wird geworfen, falls der aktuelle SecurityManager dem aufrufenden Code nicht erlaubt, die JVM zu beenden. Das gilt insbesondere bei Applets in einem Web-Browser. |
3.7.3 Parser der Kommandozeilenargumente Apache CLI
 
Zum Parsen der Kommandozeilenargumente bietet sich ein externes Paket von Apache an: CLI (http://jakarta.apache.org/commons/cli/). Um Optionen aufzubauen, ist als Erstes ein Options-Objekt nötig. Die Klassen befinden sich unter dem Paket org.apache.commons.cli.
Options options = new Options();
Diesem können nun einzelne Optionen mithilfe der Funktion addOption() hinzugefügt werden. Nehmen wir an, wir wollten unserer Applikation eine Option -h erlauben. Wenn sie angegeben wird, also auf der Kommandozeile -h auftaucht, soll eine Hilfe ausgegeben werden.
options.addOption( "h", false, "Hilfe anzeigen" );
Das erste Argument ist der Name der Option, die zweite Angabe eine Aussage, ob die Option Argumente hat oder nicht, und das dritte Argument ist ein Informationsstring. addOption() kann auch mit einem Option-Objekt parametrisiert werden. Für unsere Wahrheitsoption heißt dies:
Option hilfe = new Option( "h", "Hilfe anzeigen" );
options.addOption( hilfe );
Die Option-Objekte werden bei Argumenten interessant, die weitere Angaben enthalten. Ein Beispiel für die Angabe auf der Kommandozeile:
$ java Programm -size=8000 -file dumdum.txt
Die Option size erwartet ein Argument nach dem Gleichheitszeichen. Die Option kann zum Beispiel mit OptionBuilder.withLongOpt() konstruiert werden.
options.addOption( OptionBuilder.withLongOpt( "size" )
.withDescription( "size zur Angabe
der Größe" )
.withValueSeparator( ’=’ )
.hasArg()
.create() );
Um die Argumente abzufragen, muss nach dem Aufbau des Option-Objekts das konkrete Argument der Kommandozeile geparst werden. Dazu dient die Funktion parse(String args[]).
CommandLine cmd = options.parse(args);
Das CommandLine-Objekt bietet hasOption(String), mit dem eine Option abgefragt werden kann. Für unsere Wahrheitsoption heißt das:
if ( cmd.hasOption("h") )
// Hilfe-Option ist gesetzt
Die Argumente der Optionen mit Argumenten werden mit getOptionValue(String) erfragt. Bei unserer Größenangabe wäre dies:
String size = options.getOptionValue( "size" );
if ( size == null ) {
// Nicht gesetzt.
}
else {
// size ist gesetzt.
}
Auch mit hasOption() lässt sich erfragen, ob das Argument überhaupt gesetzt ist.
Die CLI-Bibliothek kann automatisch schick eine Hilfe mit den Optionen anzeigen. Dazu dient die Funktion printHelp() aus HelpFormatter.
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "programmname", options );
Ein boolean-Argument lässt sich noch anhängen und gibt dann noch mehr Informationen an.
|