Joskus kesken silmukan tulee vastaan tilanne, jossa silmukan suoritus haluttaisiin keskeyttää. Tällöin voidaan käyttää C- kielen break- lausetta, joka katkaisee sisimmän silmukan suorituksen.
private static void break_testi1() {
int summa=0,luku;
System.out.println("Anna lukuja. Summaan niitä kunnes annat 0 tai summa>20");
do {
luku = Syotto.kysy("Summa on " + summa + ". Anna luku",0);
if ( luku == 0 ) break;
summa += luku;
} while ( summa <= 20 );
System.out.println("Lukujen summa on " + summa);
}
Koska 0:lla lisääminen ei muuta summaa, olisi tietenkin do- while - silmukan ehto voitu kirjoittaa muodossa
do {
luku = Syotto.kysy("Summa on " + summa + ". Anna luku",0);
summa += luku;
} while ( luku != 0 && summa <= 20 );
mutta aina ei voida break - lausetta korvata näin yksinkertaisesti. Perus break - lauseen vika on lähinnä siinä, ettei siitä suoraan nähdä sisäkkäisten silmukoiden tapauksessa sitä, mihin saakka suoritus katkeaa. Epäselvissä tapauksissa silmukan katkaisu voidaan hoitaa nimeämällä silmukat ja ilmoittamalla break-lauseessa mikä silmukka katkaistaan:
private static void break_testi3() {
int valisumma, loppusumma = 0,luku;
System.out.println("Anna lukuja.");
System.out.println("Summaan niitä kunnes annat 99.");
System.out.println("Antamalla 0, näet välisumman");
System.out.println("Välisumman näet myös jos välisumma > 20");
laskeloppusummaa: do {
valisumma = 0;
do {
luku = Syotto.kysy("Anna luku",0);
if ( luku == 0 ) break;
if ( luku == 99 ) break laskeloppusummaa;
valisumma += luku;
} while ( luku != 0 && valisumma <= 20 );
System.out.println("Lukujen välisumma on " + valisumma);
loppusumma += valisumma;
System.out.println("Kaikkien summa on " + loppusumma);
} while ( loppusumma < 100 );
System.out.println("Lukujen loppusumma on " + loppusumma);
}
Silmukka voidaan katkaista tietenkin myös muuttamalla silmukan lopetusehtoon vaikuttavia muuttujia. Varsinkin for- lauseen tapauksessa silmukan indeksin arvon muuttaminen muualla kuin kasvatus- lauseessa on todella väkivaltaista ja rumaa, eikä tällaista pidä mennä tekemään.
Hyvin usein aliohjelmassa break voidaan korvata return-lauseella.
Lisäksi näkyviä sisäkkäisiä silmukoita voidaan välttää tekemällä sisäsilmukasta oma aliohjelma:
while ( ulkoehto ) {
while ( sisaehto ) {
hommia();
}
}
Eli sisäkkäisten silmukoiden tilalle kirjoitetaan:
void sisahommat() {
while ( sisaehto ) {
hommia();
}
}
...
while ( ulkoehto ) {
sisahommat();
}