do..while循環(huán)是while循環(huán)的變形,它們的區(qū)別在于do..while循環(huán)可以保證循環(huán)體執(zhí)行次數(shù)至少為1次,也就是說do..while循環(huán)的循環(huán)體執(zhí)行次數(shù)是1~N次,它有點兒先斬后奏的意思,而while循環(huán)的循環(huán)體執(zhí)行次數(shù)為0~N次。
為什么do..while循環(huán)可以保證至少執(zhí)行一次呢,它和while循環(huán)的區(qū)別在哪里呢?實際上是因為在開始執(zhí)行while循環(huán)的時候,最先執(zhí)行的是條件判斷,只有條件為true的時候才會執(zhí)行循環(huán)體,既然是這樣,那么條件就有可能為false,這個時候就會導(dǎo)致循環(huán)體執(zhí)行次數(shù)為0次,俗話說,還沒開始就結(jié)束了。而do..while循環(huán)最先執(zhí)行的不是條件判斷,它會先執(zhí)行循環(huán)體,然后再進行條件判斷,這樣就可以保證循環(huán)體至少執(zhí)行一次嘍!
接下來我們一起來看看do..while循環(huán)的語法結(jié)構(gòu),以及執(zhí)行順序,如下圖所示:
圖6-34:do..while語法結(jié)構(gòu)和執(zhí)行順序
或者參見下圖:
圖6-34:do..while語法結(jié)構(gòu)和執(zhí)行順序
上圖中清晰的描述了do..while循環(huán)執(zhí)行順序,這里就不再贅述,但需要注意的是do..while循環(huán)在最后的時候有一個半角的分號“;”,這個不能丟,丟掉之后編譯器就報錯了。接下來我們看一個do..while循環(huán)的典型案例。
示例代碼:業(yè)務(wù)背景:我們通常在使用的一個系統(tǒng)的時候需要登錄,假設(shè)用戶名或者密碼記不清楚了,你是不是需要不斷的“反復(fù)的”輸入用戶名和密碼,這就是一個非常典型的循環(huán)案例,而這個循環(huán)當(dāng)中首先要做的第一件事兒不是判斷用戶名和密碼是否正確,它的起點是先讓用戶輸入用戶名和密碼,所以這個時候我們就需要使用do..while循環(huán)來完成。請看以下代碼:
java.util.Scanner scanner = new java.util.Scanner(System.in);
String username;
String password;
do{
System.out.print("用戶名:");
username = scanner.next();
System.out.print("密碼:");
password = scanner.next();
}while(!username.equals("admin") || !password.equals("123"));
System.out.println("登錄成功,歡迎" + username + "回來!");
運行效果如下圖所示:
圖6-36:do..while案例
解釋以上程序:先提示用戶輸入用戶名和密碼,然后判斷用戶名和密碼,當(dāng)用戶名不是admin或者密碼不是123的時候繼續(xù)提示用戶輸入用戶名和密碼,直到用戶輸入的用戶名是admin并且密碼是123的時候循環(huán)結(jié)束,循環(huán)結(jié)束之后輸出登錄成功的信息,只要循環(huán)沒有結(jié)束就表示用戶名和密碼還是不對,當(dāng)然,在現(xiàn)實的系統(tǒng)當(dāng)中我們不可能允許用戶無限制的輸入用戶名和密碼,通常會給幾次輸入機會,當(dāng)機會用完之后還是沒有登錄成功,通常該賬戶就被鎖定了,你不妨試試這種業(yè)務(wù)又應(yīng)該如何完成。
總之while和do..while循環(huán)的區(qū)別就在于do..while會先執(zhí)行一次循環(huán)體,然后再判斷條件,這樣do..while的循環(huán)體至少執(zhí)行一次。而while循環(huán)則是先判斷條件是否合法,如果不合法,則循環(huán)體就沒有任何執(zhí)行的機會。while循環(huán)體執(zhí)行次數(shù)是0~N次,但是do..while循環(huán)體執(zhí)行次數(shù)則是1~N次。