Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:java:einrueck

Korrektes Einrücken

Es wird ja von vielen Anfängern als unnötig pingelig betrachtet, wenn das Einrücken des Quellcodes so wichtig genommen wird. Aber wenn es drauf ankommt, ist man immer froh, wenn man gewissenhaft vorgegangen ist, weil das genau den Unterschied macht zwischen Fehler finden oder aufgeben müssen.

Außerdem verlangt es der Anstand, dass man sein Programm dem Leser ordentlich darbietet. Der Inhalt ist meist schwer genug zu verstehen, das muss man nicht noch durch schweinische Darstellung verschlimmern. Wenn jemand freundlicherweise meinen Teller spült, dann bemühe ich mich ja auch, wenigstens ordentlich aufzuessen, um es dem anderen möglichst wenig unangenehm zu machen.

Grundregeln

  • Ein- und wieder ausgerückt wird in Stufen von zwei Leerzeichen. Wem das optisch zu unauffällig ist, der kann auch vier Leerzeichen verwenden. Auf jeden Fall verwendet man immer die gleiche Anzahl.
  • Zum Einrücken verwenden wir keine Tabulatoren, weil die in verschiedenen Editoren verschieden weit angezeigt werden.
  • Eingerückt wird, wenn nach dem Öffnen einer Klammer eine neue Zeile begonnen wird, weil das, was man da schreibt das Innere des Vorhergehenden ist. Diese Regel wird hauptsächlich auf geschweifte und manchmal auch runde Klammern angewandt, seltener auf eckige (weil man nach dem Öffnen einer solchen nur selten eine neue Zeile beginnt).
  • Die schließende Klammer wird genau so weit ausgerückt, wie die Zeile mit der zugehörigen öffnenden Klammer.
  • Bekommt man einen Befehl nicht in eine Zeile, so rückt man nachfolgende Zeilen ein, die noch zu diesem Befehl gehören. Wenn der Befehl zu Ende ist, geht man wieder raus auf die vorherige Stufe.
public class Beispiel{
  public static void main(String[] args){
    System.out.println("Hallo");
    if(args.length>0)
      System.out.println(args[0]);
  }
}

Blöcke

Will man mehrere Befehle zu einem einzigen zusammenfassen, so schreibt man sie in geschweifte Klammern. Das ganze nennt man dann einen Block. Blöcke sind sehr wichtig überall, wo es um Strukturen geht, z.B. in if-else.

Wenn ich abends hungrig bin, esse ich ein Käsebrot und eine Sahnetorte, danach gehe ich ins Bett. Bin ich nicht hungrig, esse ich nichts und gehe einfach so ins Bett. Folgendes ist ganz falsch!

if(hungrig)
  iss(käsebrot);
  iss(sahnetorte);
gehezu(bett);

Nur weil iss(sahnetorte) eingerückt ist, gehört es noch lange nicht zu dem if-Teil. Der Compiler schaut sich die Einrückungen gar nicht an. Er geht davon aus, dass zum if genau ein Befehl gehört und das ist der iss(käsebrot). Wenn ich also nicht hungrig bin, wird nur das Käsebrot nicht gegessen. Alles, was nach dem if kommt, wird auf jeden Fall durchgeführt und nach dem if ist die Stelle iss(sahnetorte). Ich werde also mit einer Sahnetorte zuviel im Bauch ins Bett gehen und schlecht schlafen.

Damit es vom Compiler so verstanden wird, wie ich es gemeint habe, muss ich schreiben

if(hungrig){
  iss(käsebrot);
  iss(sahnetorte);
}
gehezu(bett);

Mit den geschweiften Klammern ist aus den beiden iss(…) ein Block geworden, was einem einzigen Befehl entspricht. Passen Sie immer auf, dass die Klammern stimmen, damit das Programm richtig funktioniert und dass die Einrückungen stimmen, damit man als Mensch gleich sieht, wie es gemeint ist.

if-else Langversion

Wenn man eine Weile drüber nachdenkt, bemerkt man, dass if mit else gesondert behandelt werden muss. Wir halten uns an die einfache Regel:

  • else bekommt die gleiche Einrücktiefe wie das zugehörige if.
public class Beispiel{
  public static void main(String[] args){
    System.out.print("Hallo ");
    if(args.length<1)
      System.out.println("Leute");
    else{
      System.out.println(args[0]);
      if(args[0].equals("Hans")){
        System.out.println("Mein Meister!");
        System.out.println("Endlich bist du da.");
      }
      else{
        System.out.println("Ich kenne dich nicht.");
        System.out.println("Geh fort!");
      }
    }
  }
}

if-else Kurzversion

  • Passt der Befehl nach if noch gut in die Zeile, so darf er nahtlos angefügt werden. Bei else gilt das gleiche.
  • Sind auch noch Blocks in geschweiften Klammern beteiligt, kann man das else zwischen diese schreiben.
public class Beispiel{
  public static void main(String[] args){
    System.out.print("Hallo ");
    if(args.length<1) System.out.println("Leute");
    else{
      System.out.println(args[0]);
      if(args[0].equals("Hans")){
        System.out.println("Mein Meister!");
        System.out.println("Endlich bist du da.");
      } else{
        System.out.println("Ich kenne dich nicht.");
        System.out.println("Geh fort!");
      }
    }
  }
}

if-else-Ketten

Manchmal hat man eine längere Kette von ifs, von denen das jeweils nächste im inneren des vorher gehenden else steht. Neben der gewissenhaften Version mit immer weiter voranschreitender Einrückung …

  if(x<10) System.out.println("klein");
  else
    if(x<50) System.out.println("nicht mehr so klein");
    else
      if(x<100) System.out.println("größer");
      else
        System.out.println("ziemlich groß");
  System.out.println("ist diese Zahl, nämlich "+x);

… erlauben wir auch eine gedrungenere Fassung. In anderen Sprachen gibt es dafür sogar den Befehl elseif, den aber Java nicht kennt. Wir schreiben:

  if(x<10)
    System.out.println("klein");
  else if(x<50)
    System.out.println("nicht mehr so klein");
  else if(x<100)
    System.out.println("größer");
  else
    System.out.println("ziemlich groß");
  System.out.println("ist diese Zahl, nämlich "+x);

Die zweite Darstellung ist inhaltlich völlig identisch mit der ersten. Sie ist jedoch im strengen Sinne nicht korrekt eingerückt, weil ein else nicht die gleiche Einrückungstiefe hat, wie das zugehörige if. In diesem besonderen Fall ist das Verständnis dadurch aber eher verbessert als gestört.

Um sicher zu gehen, dass Sie alles verstanden haben, sollten Sie sich überlegen, was das Fragment ausgibt, wenn x den Werte 0 hat (oder 20 oder 60 oder 150).

Anderer Geschmack

Es gibt noch eine andere Art, korrekt einzurücken, die ich nicht mag aber toleriere, wenn sie ordentlich angewandt wird. Manche Leute fangen nämlich gern mit einer öffnenden Klammer auch eine neue Zeile an. Das sieht dann so aus:

public class Beispiel
{
  public static void main(String[] args)
  {
    System.out.println("Hallo");
    if(args.length>0)
      System.out.println(args[0]);
  }
}

Leerzeilen

Zwischen zwei Methoden lässt man übrigens immer eine Zeile frei. Das ist zwar keine Aussage zu Einrückungen, aber trotzdem hier zu nennen!

info/java/einrueck.txt · Zuletzt geändert: 2010/12/07 21:05 von admin