Java流程控制語(yǔ)句最全匯總(下篇)
前文
本章是關(guān)于Java流程控制語(yǔ)句的最全匯總,本篇為匯總下篇。
流程是人們生活中不可或缺的一部分,它表示人們每天都在按照一定的流程做事。
比如出門(mén)搭車(chē)、上班、下班、搭車(chē)回家。這其中的步驟是有順序的。
程序設(shè)計(jì)也需要有流程控制語(yǔ)句來(lái)完成用戶的要求,根據(jù)用戶的輸入決定程序要進(jìn)入什么流程,即“做什么”以及“怎么做”等。
從結(jié)構(gòu)化程序設(shè)計(jì)角度出發(fā),程序有 3 種結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
若是在程序中沒(méi)有給出特別的執(zhí)行目標(biāo),系統(tǒng)則默認(rèn)自上而下一行一行地執(zhí)行該程序,這類(lèi)程序的結(jié)構(gòu)就稱(chēng)為順序結(jié)構(gòu)。
到目前為止,我們所編寫(xiě)的程序都屬于順序結(jié)構(gòu)。
但是事物的發(fā)展往往不會(huì)遵循早就設(shè)想好的軌跡進(jìn)行,因此,所設(shè)計(jì)的程序還需要能夠具有在不同的條件下處理不同問(wèn)題以及當(dāng)需要進(jìn)行一些相同的重復(fù)操作時(shí),如何能省時(shí)省力地解決問(wèn)題的能力。
在本章中,我們將對(duì) Java 程序中的上述3種流程結(jié)構(gòu)進(jìn)行學(xué)習(xí)。
初學(xué)者應(yīng)該對(duì)本章的每個(gè)小節(jié)進(jìn)行仔細(xì)閱讀、思考,這樣才能達(dá)到事半功倍的效果。
Java foreach語(yǔ)句的用法
foreach 循環(huán)語(yǔ)句是 Java 1.5 的新特征之一,在遍歷數(shù)組、集合方面,foreach 為開(kāi)發(fā)者提供了極大的方便。
foreach 循環(huán)語(yǔ)句是 for 語(yǔ)句的特殊簡(jiǎn)化版本,主要用于執(zhí)行遍歷功能的循環(huán)。
foreach 循環(huán)語(yǔ)句的語(yǔ)法格式如下:
for(類(lèi)型 變量名:集合) { 語(yǔ)句塊; }
其中,“類(lèi)型”為集合元素的類(lèi)型,“變量名”表示集合中的每一個(gè)元素,“集合”是被遍歷的集合對(duì)象或數(shù)組。
每執(zhí)行一次循環(huán)語(yǔ)句,循環(huán)變量就讀取集合中的一個(gè)元素,其執(zhí)行流程如圖 1 所示。
圖 1 foreach 循環(huán)語(yǔ)句的執(zhí)行流程圖
例 1
假設(shè)有一個(gè)數(shù)組,采用 for 語(yǔ)句遍歷數(shù)組的方式如下:
// 聲明并初始化數(shù)組 int[] numbers = { 43, 32, 53, 54, 75, 7, 10 }; System.out.println("----for----"); // for語(yǔ)句 for (int i = 0; i < numbers.length; i++) { System.out.println("Count is:" + numbers[i]); }
上述第 2 行語(yǔ)句聲明并初始化了 7 個(gè)元素?cái)?shù)組集合,目前大家只需要知道當(dāng)初始化數(shù)組時(shí),要把相同類(lèi)型的元素放到 {…} 中并且用逗號(hào)分隔(,)即可。
關(guān)于數(shù)組集合會(huì)在教程后面詳細(xì)介紹,這里我們只需要大概了解就可以。
numbers.length 是獲得數(shù)組的長(zhǎng)度,length 是數(shù)組的屬性,numbers[i] 是通過(guò)數(shù)組下標(biāo)訪問(wèn)數(shù)組元素。
那么采用 for-each 循環(huán)語(yǔ)句遍歷數(shù)組的方式如下:
// 聲明并初始化int數(shù)組 int[] numbers = { 43, 32, 53, 54, 75, 7, 10 }; System.out.println("----for each----"); // for-each語(yǔ)句 for (int item : numbers) { System.out.println("Count is:" + item); }
從示例中可以發(fā)現(xiàn),item 不是循環(huán)變量,它保存了集合中的元素,for-each 語(yǔ)句將集合中的元素一一取出來(lái),并保存到 item 中,這個(gè)過(guò)程中不需要使用循環(huán)變量,通過(guò)數(shù)組下標(biāo)訪問(wèn)數(shù)組中的元素。
可見(jiàn) for-each 語(yǔ)句在遍歷集合的時(shí)候要簡(jiǎn)單方便得多。
例 2
String[] urls = { "http://c.biancheng.net/java", "http://c.biancheng.net/c", "http://c.biancheng.net/golang/" }; // 使用foreach循環(huán)來(lái)遍歷數(shù)組元素 // 其中book將會(huì)自動(dòng)迭代每個(gè)數(shù)組元素 for (String url : urls) { System.out.println(url); }
從上面程序可以看出,使用 foreach 循環(huán)遍歷數(shù)組元素時(shí)無(wú)須獲得數(shù)組長(zhǎng)度,也無(wú)須根據(jù)索引來(lái)訪問(wèn)數(shù)組元素。
foreach 循環(huán)和普通循環(huán)不同的是,它無(wú)須循環(huán)條件,無(wú)須循環(huán)迭代語(yǔ)句,這些部分都由系統(tǒng)來(lái)完成,foreach 循環(huán)自動(dòng)迭代數(shù)組的每個(gè)元素,當(dāng)每個(gè)元素都被迭代一次后,foreach 循環(huán)自動(dòng)結(jié)束。
當(dāng)使用 foreach 循環(huán)來(lái)迭代輸出數(shù)組元素或集合元素時(shí),通常不要對(duì)循環(huán)變量進(jìn)行賦值,雖然這種賦值在語(yǔ)法上是允許的,但沒(méi)有太大的實(shí)際意義,而且極容易引起錯(cuò)誤。
例如下面程序。
String[] urls = { "http://c.biancheng.net/java", "http://c.biancheng.net/c", "http://c.biancheng.net/golang/" }; // 使用foreach循環(huán)來(lái)遍歷數(shù)組元素,其中 book 將會(huì)自動(dòng)迭代每個(gè)數(shù)組元素 for (String url : urls) { url = "https://c.biancheng.net"; System.out.println(url); } System.out.println(urls[0]);
運(yùn)行上邊程序,將看到如下結(jié)果:
https://c.biancheng.net
https://c.biancheng.net
https://c.biancheng.net/java
從上面運(yùn)行結(jié)果來(lái)看,由于在 foreach 循環(huán)中對(duì)數(shù)組元素進(jìn)行賦值,結(jié)果導(dǎo)致不能正確遍歷數(shù)組元素,不能正確地取出每個(gè)數(shù)組元素的值。
而且當(dāng)再次訪問(wèn)第一個(gè)數(shù)組元素時(shí),發(fā)現(xiàn)數(shù)組元素的值依然沒(méi)有改變。
不難看出,當(dāng)使用 foreach 來(lái)迭代訪問(wèn)數(shù)組元素時(shí),foreach 中的循環(huán)變量相當(dāng)于一個(gè)臨時(shí)變量,系統(tǒng)會(huì)把數(shù)組元素依次賦給這個(gè)臨時(shí)變量,而這個(gè)臨時(shí)變量并不是數(shù)組元素,它只是保存了數(shù)組元素的值。
因此,如果希望改變數(shù)組元素的值,則不能使用這種 foreach 循環(huán)。
使用 foreach 循環(huán)迭代數(shù)組元素時(shí),并不能改變數(shù)組元素的值,因此不要對(duì) foreach 的循環(huán)變量進(jìn)行賦值。
例 3
在一個(gè)字符串?dāng)?shù)組中存儲(chǔ)了幾種編程語(yǔ)言,現(xiàn)在將這些編程語(yǔ)言遍歷輸出。
foreach 語(yǔ)句的實(shí)現(xiàn)代碼如下:
public static void main(String[] args) { String[] languages={"Java","ASP.NET","Python","C#","PHP"}; System.out.println("現(xiàn)在流行的編程語(yǔ)言有:"); // 使用 foreach 循環(huán)語(yǔ)句遍歷數(shù)組 for(String lang:languages) { System.out.println(lang); } }
在循環(huán)體執(zhí)行的過(guò)程中,每循環(huán)一次,會(huì)將 languages 數(shù)組中的一個(gè)元素賦值給 lang 變量,直到遍歷 languages 數(shù)組中所有元素,循環(huán)終止。
該程序運(yùn)行后的結(jié)果如下所示。
現(xiàn)在流行的編程語(yǔ)言有: Java ASP.NET Python C# PHP
Java return語(yǔ)句
return 關(guān)鍵字并不是專(zhuān)門(mén)用于結(jié)束循環(huán)的,return 語(yǔ)句用于終止函數(shù)的執(zhí)行或退出類(lèi)的方法,并把控制權(quán)返回該方法的調(diào)用者。
如果這個(gè)方法帶有返回類(lèi)型,return 語(yǔ)句就必須返回這個(gè)類(lèi)型的值;如果這個(gè)方法沒(méi)有返回值,可以使用沒(méi)有表達(dá)式的 return 語(yǔ)句。
return 語(yǔ)句的一般語(yǔ)法格式如下:
return 與方法相同類(lèi)型的變量;
如果一個(gè)方法使用了 return 語(yǔ)句并且后面跟有該方法返回類(lèi)型的值,那么調(diào)用此方法后,所得到的結(jié)果為該方法返回的值。
例 1
當(dāng)用戶輸入兩個(gè) double 類(lèi)型的數(shù)值后需要計(jì)算這兩個(gè)數(shù)值之和,而這兩個(gè)操作數(shù)是可以變動(dòng)的,但是求和的功能是不變的,這時(shí)就需要定義一個(gè)方法,只要在需要求和時(shí)調(diào)用該方法即可,該方法將計(jì)算之后的結(jié)果返回。代碼如下:
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("請(qǐng)輸入操作數(shù)1:"); double num1 = input.nextDouble(); // 獲取用戶輸入的操作數(shù)1 System.out.println("請(qǐng)輸入操作數(shù)2:"); double num2 = input.nextDouble(); // 獲取用戶輸入的操作數(shù)2 double d = sum(num1, num2); System.out.println(num1 + "+" + num2 + "=" + d); } /** * 創(chuàng)建sum() 方法,返回double 類(lèi)型的數(shù)值 * * @param i 操作數(shù)1 * @param j 操作數(shù)2 * @return 兩個(gè)操作數(shù)之和 */ public static double sum(double i, double j) { double sum = i + j; return sum; } }
當(dāng)用戶輸入兩個(gè) double 類(lèi)型的數(shù)值后,程序調(diào)用 sum() 方法。
該方法有兩個(gè)參數(shù),分別表示用戶輸入的操作數(shù) 1 和操作數(shù) 2。
在調(diào)用該方法時(shí),只需要將用戶輸入的兩個(gè)數(shù)值傳遞過(guò)去即可,然后程序會(huì)執(zhí)行 sum() 方法,對(duì)這兩個(gè)數(shù)求和,并使用 return 語(yǔ)句將計(jì)算得出的結(jié)果返回。
在 main() 方法中,同樣需要使用 double 類(lèi)型的變量來(lái)接收 sum() 方法返回的值,即變量 d 為計(jì)算后的結(jié)果。
運(yùn)行后的結(jié)果如下所示:
請(qǐng)輸入操作數(shù)1: 500 請(qǐng)輸入操作數(shù)2: 203 500.0+203.0=703.0 請(qǐng)輸入操作數(shù)1: 5.66 請(qǐng)輸入操作數(shù)2: 3.0158 5.66+3.0158=8.6758
Java break語(yǔ)句:跳出循環(huán)
某些時(shí)候需要在某種條件出現(xiàn)時(shí)強(qiáng)行終止循環(huán),而不是等到循環(huán)條件為 false 時(shí)才退出循環(huán)。
此時(shí),可以使用 break 來(lái)完成這個(gè)功能。
break 用于完全結(jié)束一個(gè)循環(huán),跳出循環(huán)體。不管是哪種循環(huán),一旦在循環(huán)體中遇到 break,系統(tǒng)將完全結(jié)束該循環(huán),開(kāi)始執(zhí)行循環(huán)之后的代碼。
在 Java 中,break 語(yǔ)句有 3 種作用,分別是:在 switch 語(yǔ)句中終止一個(gè)語(yǔ)句序列、使用 break 語(yǔ)句直接強(qiáng)行退出循環(huán)和使用 break 語(yǔ)句實(shí)現(xiàn) goto 的功能。
使用 break 語(yǔ)句直接強(qiáng)行退出循環(huán)(break 不帶標(biāo)簽)
可以使用 break 語(yǔ)句強(qiáng)行退出循環(huán),忽略循環(huán)體中的任何其他語(yǔ)句和循環(huán)的條件判斷。
在循環(huán)中遇到 break 語(yǔ)句時(shí),循環(huán)被終止,在循環(huán)后面的語(yǔ)句重新開(kāi)始。
例 1
小明參加了一個(gè) 1000 米的長(zhǎng)跑比賽,在 100 米的跑道上,他循環(huán)地跑著,每跑一圈,剩余路程就會(huì)減少 100 米,要跑的圈數(shù)就是循環(huán)的次數(shù)。
但是,在每跑完一圈時(shí),教練會(huì)問(wèn)他是否要堅(jiān)持下去,如果回答 y,則繼續(xù)跑,否則表示放棄。
使用 break 語(yǔ)句直接強(qiáng)行退出循環(huán)的示例如下:
public static void main(String[] args) { Scanner input = new Scanner(System.in); // 定義變量存儲(chǔ)小明的回答 String answer = ""; // 一圈100米,1000米為10圈,即為循環(huán)的次數(shù) for (int i = 0; i < 10; i++) { System.out.println("跑的是第" + (i + 1) + "圈"); System.out.println("還能堅(jiān)持嗎?"); // 獲取小明的回答 answer = input.next(); // 判斷小明的回答是否為y?如果不是,則放棄,跳出循環(huán) if (!answer.equals("y")) { System.out.println("放棄"); break; } // 循環(huán)之后的代碼 System.out.println("加油!繼續(xù)!"); } }
該程序運(yùn)行后的效果如下所示:
跑的是第1圈 還能堅(jiān)持嗎? y 加油!繼續(xù)! 跑的是第2圈 還能堅(jiān)持嗎? y 加油!繼續(xù)! 跑的是第3圈 還能堅(jiān)持嗎? n 放棄
盡管 for 循環(huán)被設(shè)計(jì)為從 0 執(zhí)行到 10,但是當(dāng)小明的回答不是 y 時(shí),break 語(yǔ)句終止了程序的循環(huán),繼續(xù)執(zhí)行循環(huán)體外的代碼,輸出“加油!繼續(xù)!”。
break 語(yǔ)句能用于任何 Java 循環(huán)中,包括人們有意設(shè)置的無(wú)限循環(huán)。
在一系列嵌套循環(huán)中使用 break 語(yǔ)句時(shí),它將僅僅終止最里面的循環(huán)。例如:
public static void main(String[] args) { // 外循環(huán),循環(huán)5次 for (int i = 0; i < 5; i++) { System.out.print("第" + (i + 1) + "次循環(huán):"); // 內(nèi)循環(huán),設(shè)計(jì)為循環(huán)10次 for (int j = 0; j < 10; j++) { // 判斷j是否等于3,如果是,則終止循環(huán) if (j == 3) { break; } System.out.print("內(nèi)循環(huán)的第" + (j + 1) + "次循環(huán)\t"); } System.out.println(); } }
該程序運(yùn)行結(jié)果如下所示:
第1次循環(huán):內(nèi)循環(huán)的第1次循環(huán) 內(nèi)循環(huán)的第2次循環(huán) 內(nèi)循環(huán)的第3次循環(huán) 第2次循環(huán):內(nèi)循環(huán)的第1次循環(huán) 內(nèi)循環(huán)的第2次循環(huán) 內(nèi)循環(huán)的第3次循環(huán) 第3次循環(huán):內(nèi)循環(huán)的第1次循環(huán) 內(nèi)循環(huán)的第2次循環(huán) 內(nèi)循環(huán)的第3次循環(huán) 第4次循環(huán):內(nèi)循環(huán)的第1次循環(huán) 內(nèi)循環(huán)的第2次循環(huán) 內(nèi)循環(huán)的第3次循環(huán) 第5次循環(huán):內(nèi)循環(huán)的第1次循環(huán) 內(nèi)循環(huán)的第2次循環(huán) 內(nèi)循環(huán)的第3次循環(huán)
從程序運(yùn)行結(jié)果來(lái)看,在內(nèi)部循環(huán)中的 break 語(yǔ)句僅僅終止了所在的內(nèi)部循環(huán),外部循環(huán)沒(méi)有受到任何的影響。
注意:一個(gè)循環(huán)中可以有一個(gè)以上的 break 語(yǔ)句,但是過(guò)多的 break 語(yǔ)句會(huì)破壞代碼結(jié)構(gòu)。
switch 循環(huán)語(yǔ)句中的 break 僅影響 switch 語(yǔ)句,不會(huì)影響循環(huán)。
例 2
編寫(xiě)一個(gè) Java 程序,允許用戶輸入 6 門(mén)課程成績(jī),如果錄入的成績(jī)?yōu)樨?fù)則跳出循環(huán);如果錄入 6 門(mén)合法成績(jī),則計(jì)算已有成績(jī)之和。
使用 break 語(yǔ)句的實(shí)現(xiàn)代碼如下:
public static void main(String[] args) { int score; // 每門(mén)課的成績(jī) int sum = 0; // 成績(jī)之和 boolean con = true; // 記錄錄入的成績(jī)是否合法 Scanner input = new Scanner(System.in); System.out.println("請(qǐng)輸入學(xué)生的姓名:"); String name = input.next(); // 獲取用戶輸入的姓名 for (int i = 1; i <= 6; i++) { System.out.println("請(qǐng)輸入第" + i + "門(mén)課程的成績(jī):"); score = input.nextInt();// 獲取用戶輸入的成績(jī) if (score < 0) { // 判斷用戶輸入的成績(jī)是否為負(fù)數(shù),如果為負(fù)數(shù),終止循環(huán) con = false; break; } sum = sum + score; // 累加求和 } if (con) { System.out.println(name + "的總成績(jī)?yōu)椋? + sum); } else { System.out.println("抱歉,分?jǐn)?shù)錄入錯(cuò)誤,請(qǐng)重新錄入!"); } }
運(yùn)行程序,當(dāng)用戶錄入的分?jǐn)?shù)低于 0 時(shí),則輸出“抱歉,分?jǐn)?shù)錄入錯(cuò)誤,請(qǐng)重新錄入!”信息,否則打印學(xué)生的總成績(jī)。輸出結(jié)果如下所示。
請(qǐng)輸入學(xué)生的姓名: zhangpu 請(qǐng)輸入第1門(mén)課程的成績(jī): 100 請(qǐng)輸入第2門(mén)課程的成績(jī): 75 請(qǐng)輸入第3門(mén)課程的成績(jī): -8 抱歉,分?jǐn)?shù)錄入錯(cuò)誤,請(qǐng)重新錄入! 請(qǐng)輸入學(xué)生的姓名: zhangpu 請(qǐng)輸入第1門(mén)課程的成績(jī): 100 請(qǐng)輸入第2門(mén)課程的成績(jī): 68 請(qǐng)輸入第3門(mén)課程的成績(jī): 73 請(qǐng)輸入第4門(mén)課程的成績(jī): 47 請(qǐng)輸入第5門(mén)課程的成績(jī): 99 請(qǐng)輸入第6門(mén)課程的成績(jī): 84 zhangpu的總成績(jī)?yōu)椋?71
在該程序中,當(dāng)錄入第 3 門(mén)課的成績(jī)時(shí),錄入的成績(jī)?yōu)樨?fù)數(shù),判斷條件“score<0”為 true,執(zhí)行“con=false”,用 con 來(lái)標(biāo)記錄入是否有誤。
接著執(zhí)行 break 語(yǔ)句,執(zhí)行完之后程序并沒(méi)有繼續(xù)執(zhí)行條件語(yǔ)句后面的語(yǔ)句,而是直接退出 for 循環(huán)。之后執(zhí)行下面的條件判斷語(yǔ)句,判斷 boolean 變量的 con 是否為 true,如果為 true,則打印總成績(jī);否則打印“抱歉,分?jǐn)?shù)錄入錯(cuò)誤,請(qǐng)重新錄入!”。
使用 break 語(yǔ)句實(shí)現(xiàn) goto 的功能(break 帶標(biāo)簽)
有時(shí)候,在嵌套很深的循環(huán)語(yǔ)句中會(huì)發(fā)生一些不可預(yù)料的事情。
此時(shí)可能更加希望跳到嵌套的所有循環(huán)語(yǔ)句之外。
通過(guò)添加一些額外的條件判斷實(shí)現(xiàn)各層循環(huán)的檢測(cè)很不方便。
幸運(yùn)的是,Java 與 C++ 不同,Java 提供了一種帶標(biāo)簽的 break 語(yǔ)句,用于跳出多重嵌套的循環(huán)語(yǔ)句。
break 語(yǔ)句可以實(shí)現(xiàn) goto 的功能,并且 Java 定義了 break 語(yǔ)句的一種擴(kuò)展形式來(lái)處理退出嵌套很深的循環(huán)這個(gè)問(wèn)題。
通過(guò)使用擴(kuò)展的 break 語(yǔ)句,可以終止執(zhí)行一個(gè)或者幾個(gè)任意代碼塊,這些代碼塊不必是一個(gè)循環(huán)或一個(gè) switch 語(yǔ)句的一部分
。同時(shí)這種擴(kuò)展的 break 語(yǔ)句帶有標(biāo)簽,可以明確指定從何處重新開(kāi)始執(zhí)行。
break 除了具有 goto 退出深層循環(huán)嵌套作用外,還保留了一些程序結(jié)構(gòu)化的特性。
標(biāo)簽 break 語(yǔ)句的通用格式如下:
break label;
label 是標(biāo)識(shí)代碼塊的標(biāo)簽。
當(dāng)執(zhí)行這種形式的 break 語(yǔ)句時(shí),控制權(quán)被傳遞出指定的代碼塊。
被加標(biāo)簽的代碼塊必須包圍 break 語(yǔ)句,但是它不需要直接包圍 break 的塊。
也就是說(shuō),可以使用一個(gè)加標(biāo)簽的 break 語(yǔ)句來(lái)退出一系列的嵌套塊,但是不能使用 break 語(yǔ)句將控制權(quán)傳遞到不包含 break 語(yǔ)句的代碼塊。
用標(biāo)簽(label)可以指定一個(gè)代碼塊,標(biāo)簽可以是任何合法有效的 Java 標(biāo)識(shí)符,后跟一個(gè)冒號(hào)。
加上標(biāo)簽的代碼塊可以作為 break 語(yǔ)句的對(duì)象,使程序在加標(biāo)簽的塊的結(jié)尾繼續(xù)執(zhí)行。
下面是使用帶標(biāo)簽的break 語(yǔ)句的示例。
public class GotoDemo { public static void main(String[] args) { label: for (int i = 0; i < 10; i++) { for (int j = 0; j < 8; j++) { System.out.println(j); if (j % 2 != 0) { break label; } } } } }
以上程序的執(zhí)行結(jié)果為:
0 1
這里的 label 是標(biāo)簽的名稱(chēng),可以為 Java 語(yǔ)言中任意合法的標(biāo)識(shí)符。
標(biāo)簽語(yǔ)句必須和循環(huán)匹配使用,使用時(shí)書(shū)寫(xiě)在對(duì)應(yīng)的循環(huán)語(yǔ)句的上面,標(biāo)簽語(yǔ)句以冒號(hào)結(jié)束。
如果需要中斷標(biāo)簽語(yǔ)句對(duì)應(yīng)的循環(huán),可以采用 break 后面跟標(biāo)簽名的方式。
如在上面代碼中,當(dāng) j 為 1 時(shí),“j%2!=0”條件表達(dá)式成立,則 label 標(biāo)簽所代表的最外層循環(huán)終止。
注意:通常緊跟 break 之后的標(biāo)簽,必須在 break 所在循環(huán)的外層循環(huán)之前定義才有意義。
在 switch 語(yǔ)句中終止一個(gè)語(yǔ)句序列
在 switch 語(yǔ)句中終止一個(gè)語(yǔ)句序列,就是在每個(gè) case 子句塊的最后添加語(yǔ)句“break;”,這個(gè)功能在《Java switch case》已經(jīng)講過(guò),這里不在講述。
Java continue語(yǔ)句詳解
有時(shí)強(qiáng)迫一個(gè)循環(huán)提早反復(fù)是有用的,也就是,你可能想要繼續(xù)運(yùn)行循環(huán),但是要忽略這次重復(fù)剩余的循環(huán)體的語(yǔ)句,所以 Java 提供了 continue 語(yǔ)句。
continue 語(yǔ)句是 break 語(yǔ)句的補(bǔ)充。
本節(jié)主要講解 continue 語(yǔ)句。
與 break 語(yǔ)句一樣, 它將中斷正常的控制流程。
continue 語(yǔ)句將控制轉(zhuǎn)移到最內(nèi)層循環(huán)的首部。
continue 語(yǔ)句是跳過(guò)循環(huán)體中剩余的語(yǔ)句而強(qiáng)制執(zhí)行下一次循環(huán),其作用為結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。
continue 語(yǔ)句類(lèi)似于 break 語(yǔ)句,但它只能出現(xiàn)在循環(huán)體中。
它與 break 語(yǔ)句的區(qū)別在于:continue 并不是中斷循環(huán)語(yǔ)句,而是中止當(dāng)前迭代的循環(huán),進(jìn)入下一次的迭代。
簡(jiǎn)單來(lái)講,continue 是忽略循環(huán)語(yǔ)句的當(dāng)次循環(huán)。
注意:continue 語(yǔ)句只能用在 while 語(yǔ)句、for 語(yǔ)句或者 foreach 語(yǔ)句的循環(huán)體之中,在這之外的任何地方使用它都會(huì)引起語(yǔ)法錯(cuò)誤。
在循環(huán)體中使用 continue 語(yǔ)句有兩種方式可以帶有標(biāo)簽,也可以不帶標(biāo)簽。語(yǔ)法格式如下:
continue //不帶標(biāo)簽
continue label //帶標(biāo)簽,label是標(biāo)簽名
下面看一個(gè)示例,代碼如下:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < numbers.length; i++) { if (i == 3) { continue; } System.out.println("Count is: " + i); }
在上述程序代碼中,當(dāng)條件 i==3 的時(shí)候執(zhí)行 continue 語(yǔ)句,continue 語(yǔ)句會(huì)終止本次循環(huán),循環(huán)體中 continue 之后的語(yǔ)句將不再執(zhí)行,接著進(jìn)行下次循環(huán),所以輸出結(jié)果中沒(méi)有 3。程序運(yùn)行結(jié)果如下:
Count is: 0 Count is: 1 Count is: 2 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9
帶標(biāo)簽的 continue 語(yǔ)句示例代碼如下:
public static void main(String[] args) { label1: for (int x = 0; x < 5; x++) { for (int y = 5; y > 0; y--) { if (y == x) { continue label1; } System.out.println(x+","+y); } } System.out.println("Game Over!"); }
默認(rèn)情況下,continue 只會(huì)跳出最近的內(nèi)循環(huán)(代碼第 3 行的 for 循環(huán)),如果要跳出代碼第 2 行的外循環(huán),可以為外循環(huán)添加一個(gè)標(biāo)簽 label1,然后在第 5 行的 continue 語(yǔ)句后面指定這個(gè)標(biāo)簽 label1,這樣當(dāng)條件滿足執(zhí)行 continue 語(yǔ)句時(shí),程序就會(huì)跳轉(zhuǎn)出外循環(huán)。
程序運(yùn)行結(jié)果如下:
0,5 0,4 0,3 0,2 0,1 1,5 1,4 1,3 1,2 2,5 2,4 2,3 3,5 3,4 4,5 Game Over!
由于跳過(guò)了 x == y,因此下面的內(nèi)容沒(méi)有輸出。
1,1 2,2 3,3 4,4
Java選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的總結(jié)
任何編程語(yǔ)言中最常見(jiàn)的程序結(jié)構(gòu)就是順序結(jié)構(gòu)。
順序結(jié)構(gòu)就是程序從上到下逐行的執(zhí)行,中間沒(méi)有任何判斷和跳轉(zhuǎn)。
如果 main 方法的多行代碼之間沒(méi)有任何流程控制,則程序總是從上向下依次執(zhí)行,排在前面的代碼先執(zhí)行,排在后面的代碼后執(zhí)行
。這意味著:如果沒(méi)有流程控制,Java 方法里的語(yǔ)句是一個(gè)順序執(zhí)行流,從上向下依次執(zhí)行每條語(yǔ)句。
不論哪一種編程語(yǔ)言,都會(huì)提供兩種基本的流程控制結(jié)構(gòu):分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
分支結(jié)構(gòu)用于實(shí)現(xiàn)根據(jù)條件來(lái)選擇性地執(zhí)行某段代碼,循環(huán)結(jié)構(gòu)則用于實(shí)現(xiàn)根據(jù)循環(huán)條件重復(fù)執(zhí)行某段代碼。
Java 同樣提供了這兩種流程控制結(jié)構(gòu)的語(yǔ)法,Java 提供了 if 和 switch 兩種分支語(yǔ)句,并提供了 while、do while 和 for 三種循環(huán)語(yǔ)句。
一般寫(xiě)循環(huán)語(yǔ)句時(shí),分以下三步走:
- 定義初始值
- 設(shè)置判斷條件
- 初始值變化
除此之外,JDK5 還提供了一種新的循環(huán):foreach 循環(huán),能以更簡(jiǎn)單的方式來(lái)遍歷集合、數(shù)組的元素。
Java 還提供了 break、continue 和 return 來(lái)控制程序的循環(huán)結(jié)構(gòu),作用如下:
- break:表示跳出當(dāng)前層循環(huán)
- continue:表示跳出本次循環(huán),進(jìn)入下一次循環(huán)
- return:跳出當(dāng)前方法的循環(huán)
當(dāng)在實(shí)現(xiàn)某個(gè)功能語(yǔ)句時(shí),如果需要通過(guò)某一個(gè)條件去判斷,則用選擇結(jié)構(gòu)。
當(dāng)實(shí)現(xiàn)某個(gè)功能需要通過(guò)循環(huán)去實(shí)現(xiàn),則用循環(huán)結(jié)構(gòu)。
當(dāng)然循環(huán)和選擇是可以相互嵌套的。
到此這篇關(guān)于Java流程控制語(yǔ)句最全匯總(下篇)的文章就介紹到這了,其他兩個(gè)部分的內(nèi)容(上、中篇)請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用Swing實(shí)現(xiàn)一個(gè)模擬電腦計(jì)算器
Java Swing 是一個(gè)用于創(chuàng)建 Java GUI(圖形用戶界面)的框架,它提供了一系列的 GUI 組件和工具,可以用于創(chuàng)建桌面應(yīng)用程序,包括按鈕、文本框、標(biāo)簽、表格等等,本文給大家介紹了Java使用Swing實(shí)現(xiàn)一個(gè)模擬計(jì)算器,感興趣的同學(xué)可以自己動(dòng)手嘗試一下2024-05-05Java中為什么要實(shí)現(xiàn)Serializable序列化
在Java編程中,Serializable序列化是一個(gè)常見(jiàn)的概念,它允許對(duì)象在網(wǎng)絡(luò)上傳輸或持久化到磁盤(pán)上,本文將深入探討為什么在Java中要實(shí)現(xiàn)Serializable序列化,并通過(guò)示例代碼來(lái)解釋其重要性2023-10-10JAVA之讀取properties時(shí)路徑的注意問(wèn)題
這篇文章主要介紹了JAVA之讀取properties時(shí)路徑的注意問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Java實(shí)現(xiàn)多個(gè)單張tif文件合并成一個(gè)多頁(yè)tif文件
業(yè)務(wù)部門(mén)需要將多個(gè)單張的tiff文件,合并成一個(gè)多頁(yè)的tiff文件,本文就來(lái)介紹一下如何實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09SpringBoot項(xiàng)目不占用端口啟動(dòng)的方法
這篇文章主要介紹了SpringBoot項(xiàng)目不占用端口啟動(dòng)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng)
這篇文章主要介紹了關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java多線程中wait、notify、notifyAll使用詳解
這篇文章主要介紹了Java多線程中wait、notify、notifyAll使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05