Wieso muss man bei einer switch-Anweisung in jedem case-Teil ein break; einfügen? Kann das nicht automatisch danach abbrechen?

Es gibt Probleme, bei deren Lösung man für mehrere Fälle die gleichen Anweisungen ausführen will. Mit einer switch-Anweisung, in der nicht jede case-Anweisung mit einem break abschließt, können solche Probleme elegant gelöst werden.

Beispiel:

static int tage(int monat) {
    int result;
    switch(monat) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            result = 31;
            break;
        case 4: case 6: case 9: case 11:
            result = 30;
            break;
        case 2:
            result = 28; // TODO: Schaltjahr
            break;
        default:
            throw new IllegalArgumentException();
    }
    return result;
}

Die Methode tage() gibt für jeden Monat die Anzahl der Tage zurück. Die Monate 1, 3, 5, … sind gleich zu behandeln und werden daher mit einem gemeinsamen break abgeschlossen.