Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
gp Kapitel 3 Klassen und Objekte
  gp 3.1 Objektorientierte Programmierung
    gp 3.1.1 Warum überhaupt OOP?
    gp 3.1.2 Modularität und Wiederverwertbarkeit
  gp 3.2 Klassen benutzen
    gp 3.2.1 Die Klasse Point
    gp 3.2.2 Etwas über die UML
    gp 3.2.3 Anlegen eines Exemplars einer Klasse mit new
    gp 3.2.4 Zugriff auf Variablen und Methoden mit dem ».«
    gp 3.2.5 Konstruktoren
  gp 3.3 Import und Pakete
  gp 3.4 Die API-Dokumentation
  gp 3.5 Mit Referenzen arbeiten
    gp 3.5.1 Die null-Referenz
    gp 3.5.2 Zuweisungen bei Referenzen
    gp 3.5.3 Funktionen mit nichtprimitiven Parametern
    gp 3.5.4 Gleichheit von Objekten und die Methode equals()
  gp 3.6 Arrays
    gp 3.6.1 Deklaration von Arrays
    gp 3.6.2 Arrays mit Inhalt
    gp 3.6.3 Die Länge eines Arrays über das Attribut length
    gp 3.6.4 Zugriff auf die Elemente
    gp 3.6.5 Array-Objekte erzeugen
    gp 3.6.6 Fehler bei Arrays
    gp 3.6.7 Arrays mit nicht-primitiven Elementen
    gp 3.6.8 Initialisierte Array-Objekte
    gp 3.6.9 Die erweiterte for-Schleife
    gp 3.6.10 Mehrdimensionale Arrays
    gp 3.6.11 Die Wahrheit über die Array-Initialisierung
    gp 3.6.12 Mehrere Rückgabewerte
    gp 3.6.13 Argument per Referenz übergeben
    gp 3.6.14 Arrays klonen
    gp 3.6.15 Feldinhalte kopieren
    gp 3.6.16 Die Klasse Arrays zum Vergleichen, Füllen, Suchen
    gp 3.6.17 Methode mit variabler Argumentanzahl (vararg)
  gp 3.7 Der Einstiegspunkt für das Laufzeitsystem main()
    gp 3.7.1 Kommandozeilen-Parameter ausgeben
    gp 3.7.2 Der Rückgabewert von main() und System.exit()
    gp 3.7.3 Parser der Kommandozeilenargumente Apache CLI
  gp 3.8 Eigene Pakete schnüren
    gp 3.8.1 Die package-Anweisung
    gp 3.8.2 Importieren von Klassen mit import
    gp 3.8.3 Paketnamen
    gp 3.8.4 Hierarchische Strukturen und das Default-Package
    gp 3.8.5 Klassen mit gleiche Namen in unterschiedlichen Paketen
    gp 3.8.6 Statische Imports
    gp 3.8.7 Eine Verzeichnisstruktur für eigene Projekte


Galileo Computing

3.7 Der Einstiegspunkt für das Laufzeitsystem main(downtop

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.


Galileo Computing

3.7.1 Kommandozeilen-Parameter ausgeben  downtop

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


Galileo Computing

3.7.2 Der Rückgabewert von main() und System.exit()  downtop

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

gp  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.

Galileo Computing

3.7.3 Parser der Kommandozeilenargumente Apache CLI  toptop

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.





Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de