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(); }