Java Getriebe

Java und NetBeans

Von Argumenten, Parametern und Optionen

Nachdem ich beschrieben habe, wie man hart kodierte Pfadangaben für Eingabedateien vermeiden kann, möchte ich jetzt kurz beschreiben wie man die Kommandozeile ordentlich auswertet.

Wie in der Überschrift schon angedeutet geht es dabei nicht nur um den Quellcode selbst, sondern auch um eine allgemeine Begriffserklärung. Ich möchte hier aber auch klar stellen, dass es sich hier um meine Definition handelt. Sie ist nicht unbedingt DIE Definition, aber für mich ist sich für dieses Artikel am brauchbarsten.

Argument
Als Argument bezeichne ich die einzelnen Teile der Kommandozeile. Also genau das, was auch in dem String Arrays der main Methode zu finden ist. Die einzelnen Argumente der Kommandozeile werden in der Konsole durch Leerzeichen voneinander getrennt. Enthält ein Argument selbst ein Leerzeichen, so kann es durch Anführungszeichen umschlossen werden.
Option
Eine Option oder auch Schalter sind jene Argumente, die mit einem Minuszeichen oder Schrägstrich beginnen. Es folgt in der Regel ein einzelner Buchstabe, ist aber kein Muß. Eine „Langform“ der Option fängt meist mit einem doppelten Minuszeichen an. So kann man die Option zu einem „Debugmodus“ mit -d oder --debug angeben.
Parameter
Der Einfachheit halber kann man sagen: Alle Argumente, die keine Optionen sind, sind Parameter. Also Dateinamen oder Zusatzinformationen zu einer Option. So ist es ja durchaus sinnvoll einer Option --lang auch die Information anzugeben, welche Sprache man haben möchte. Der Parameter könnte für dieses Beispiel de_DE lauten.

Mit diesem Wissen ist dann vielleicht auch der folgende Quelltext verständlich:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void parseCommandline(String[] args) {
  int status = PARAM_DEFAULT;
  for(String arg: args) {
    if(arg.charAt(0) == '-') {
      switch(arg.charAt(1)) {
        case 'd':
          debugModus = true;
          break;
        case 'l':
          status = PARAM_LANG;
          break;
      }
    } else {
      switch(status) {
        case PARAM_LANG:
          lang = arg;
          break;
      }
      status = PARAM_DEFAULT;
    }
  }
}

Die Methode durchläuft also in einer erweiterten for-Schleife (Zeile 3) alle Argumente der Kommandozeile und teilt diese in Optionen und Parameter auf (Zeile 4). Diese werden dann jeweils in einer switch-Anweisung für die Optionen (Zeile 5) und Parametern (Zeile 14) weiter verarbeitet.

Bei den Parametern spielt die Variable status eine gewichtige Rolle. Es muss hier schließlich unterschieden werden, ob der Parameter „einfach so“ in der Kommandozeile steht oder ob es eine Zusatzinformation zu einer Option ist. Der Wert für status wird zum Beispiel in Zeile 10 auf Jetzt kommt die Sprachinformation gesetzt und schließlich im nächsten Schleifendurchlauf in Zeile 16 die eigentliche Information in einer Variable gespeichert. Hinter der Switch Anweisung wird der Status wieder auf „Standard“ gesetzt um nicht aus versehen im nächsten Schleifendurchlauf erneut die Sprachinformation zu überschreiben.

In dieser Vorlage lassen sich nun durch einfaches Hinzufügen eines neuen case Eintrags erweitern. Eingabedateien, Ausgabedateien, Hilfe (-?) oder was auch immer im eigenen Programm über einen Parameter gesteuert werden kann.

Was in der Methode noch fehlt sind Fehlerprüfungen, die ich aber absichtlich nicht angegeben habe um den Quelltext hier übersichtlich zu halten. So müsste man eigentlich in jeder der beiden switch-Anweisungen einen default Eintrag hinzufügen und dort „Unbekannte Option“ bzw. „Unbekannter Parameter“ als Fehlermeldung ausgeben. Genauso müsste vor der Options-switch geprüft werden ob status den Wert PARAM_DEFAULT hat. Ansonsten wurde zu einer Option der nötige Parameter nicht angegeben (Die gleiche Abfrage gehört ans Ende der Methode!) In letzter Instanz müsste auch geprüft werden, ob für „arg“ überhaupt ein zweites Zeichen existiert. Der Endanwender könnte ja schließlich auch nur ein Minuszeichen „-“ in der Kommandozeile angeben. Der obige Quelltext würde dies mit einer unschönen IndexOutOfBoundsException quittieren.

One Response to Von Argumenten, Parametern und Optionen

  1. Pingback: Java Getriebe » Blog Archive » Kommandozeile auswerten mit enums