![Java核心编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/463/34752463/b_34752463.jpg)
2.4 控制流程语句
控制流程语句用于控制程序按照一定流程来执行。
2.4.1 if-then
if-then语句是指只有if后面是true时才执行特定的代码。
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P62_54613.jpg?sign=1739077294-DiRPmzcEixx6AKi7SwNUxnx6ORJu0cnM-0-8210796e1401a1a71dde1758e6fd129c)
如果if后面是false,就跳到if-then语句后面。语句可以省略中括号,例如:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P63_54614.jpg?sign=1739077294-3ayMmmcgA7qVPwnS8tmgqCIkpGJ4a81t-0-dea5e32d5924b36428187b20a590aa9f)
注意
语句可以省略中括号,但在编码规范里面不推荐使用,因为极易让人看错。
2.4.2 if-then-else
if-then-else语句在if后面是false时提供了第二个执行路径。
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P63_54615.jpg?sign=1739077294-sVMtzWzaxaYpAhvcC9gEKwFiSOIF3FiY-0-a716906fefe6dffe17e309d8675c763e)
下面是一个完整的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P63_54616.jpg?sign=1739077294-cQldNojCR5AfeDcWY9hUTb12rMVxYJMt-0-92e21361eaefd12ed96d36dda5edaf7e)
输出为:
Grade = C
2.4.3 switch
switch语句可以有许多可能的执行路径,可以使用byte、short、char和int基本数据类型,也可以是枚举类型、String以及少量的原始类型的包装类Character、Byte、Short和Integer。
下面是一个SwitchDemo例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P64_54618.jpg?sign=1739077294-7nJtX9hJW6PfZIV8Rhw7LlY9D9Tcvbn7-0-d994ed59fa0de7c90f78a5630a18671a)
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P65_54619.jpg?sign=1739077294-S7gdhFZA2JvP8I43Nz98tzXLzvLFeyTW-0-e7b3c2862d91f6f9eef6f08cf0ed607d)
其中,break语句是为了终止switch语句。
以下是一个不使用switch语句的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P65_54620.jpg?sign=1739077294-1mOoBtWesQobtUY3eBRdviXa6EbCkBga-0-90bc0b0f5e7164a35abc214b0355ab3b)
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P66_54621.jpg?sign=1739077294-34zDSIEcNGwvOgYJ0SvvJRXVDrfVjqc9-0-13b2512c7aa62762e6b02bf16f3d98fd)
输出为:
August September October November December
从技术上来说,最后一个break并不是必需的,因为流程跳出switch语句,但是仍然推荐使用break,主要是防止在修改代码后造成遗漏而出错。default用于处理所有不明确值的情况。
下面的例子展示了多个case对应一个结果的情况:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P66_54622.jpg?sign=1739077294-7OQJ9vKAz3iFDtBSBMJRRq4kLutV5Sbe-0-f757a1d4ced70cf13d88e9533098b22b)
输出为:
Number of Days = 29
从Java 7开始,可以在switch语句里面使用String,下面给出一个例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P67_54626.jpg?sign=1739077294-RorG7ngKpxyZd1MbuA506Zr9h6sHRt5g-0-a6a601cc340b301f35dd8af0f155883c)
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P68_54628.jpg?sign=1739077294-YXcKB9xrL0G3NCeEvELsSZA2r2K4Vkek-0-a6c1ca88bdf4d08bbe13b2b637ad2039)
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P69_54629.jpg?sign=1739077294-qQOcO9Q37gvSkXOWgt1hmJrXJgOG8ykD-0-0db3f590ad1041ad52c731283c74ce52)
输出为:
8
注意
switch语句表达式中不能有null。
2.4.4 while
while语句在判断条件是true时执行语句块,语法如下:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P69_54632.jpg?sign=1739077294-4N2UDgqFFUjBu8MOkvhlsOHLfW4TcjdC-0-7c10901a6e352301ec0fe562b60de71a)
while语句计算的表达式必须返回boolean值。如果表达式计算为true,while语句执行while块的所有语句。while语句继续测试表达式,然后执行它的块,直到表达式计算为false。
以下是一个完整的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P69_54633.jpg?sign=1739077294-Zo5ogemnLywFsK3V7y8KK2nnx0rY6pBz-0-d43b452e3b76e927fa64037c2e16019a)
输出为:
Count is: 1 Count is: 2 Count is: 3 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9 Count is: 10
用while语句可以实现一个无限循环,示例如下:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P70_54636.jpg?sign=1739077294-aZPkwIzpfkogBGk6K72m5ThwY8yeMk80-0-69d470ffa24744d6a11c3f881b0c69b7)
2.4.5 do-while
do-while语句的语法如下:
do { statement(s) } while (expression);
do-while语句和while语句的区别是,do-while计算表达式时在循环的底部,而不是顶部,do块的语句至少会执行一次。
以下是一个示例:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P70_54639.jpg?sign=1739077294-xdedHuGrnxXHezDLgK1O1u6bDWNsFYFF-0-2b4208b10eec3a51b41e8dd251f6a952)
输出为:
Count is: 1 Count is: 2 Count is: 3 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9 Count is: 10
2.4.6 for
for语句提供一种紧凑的方式来遍历一个范围值,该语句也被称为“for循环”,因为它反复循环,直到满足特定的条件。for语句的通常形式表述如下:
for (initialization; termination; increment) { statement(s) }
使用for语句时要注意:
· initialization初始化循环,执行一次,作为循环的开始。
· 当termination计算为false时,循环结束。
· increment会在循环中迭代执行。该表达式可以接受递增或者递减的值。
以下是一个示例:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P71_54643.jpg?sign=1739077294-OR89Hl25a6yAjf2rY3jMhclc6nAsGc0J-0-ace57c6d0c344171daf62a290b2b8477)
输出为:
Count is: 1 Count is: 2 Count is: 3 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9 Count is: 10
注意,代码是在initialization中声明变量的。该变量的存活范围从它的声明到for语句块的结束为止。所以,它可以用在termination和increment中。如果控制for语句的变量不需要在循环外部使用,那么最好是在initialization中声明。变量命名为i、j、k是经常用来控制for循环的。在initialization中声明它们,可以限制它们的生命周期,减少错误。
for循环的3个表达式都是可选的,如果想表达无限循环,可以这么写:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P72_54644.jpg?sign=1739077294-GoG0cWz7ZauR4j5QTTi3ees0GY3k32Bn-0-c734541bf13fbce84461049ff8385a4d)
for语句还可以用来迭代集合和数组,这个形式有时被称为增强的for语句,可以用来让你的循环更加紧凑,易于阅读。为了说明这一点,考虑下面的数组:
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
使用增强的for语句来循环数组:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P72_54649.jpg?sign=1739077294-m2ltvtsDnJjWNhKdbuCaunJ7WBH5r8Ut-0-6acd9cc25bb2278ce54491f8815765af)
输出:
Count is: 1 Count is: 2 Count is: 3 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9 Count is: 10
尽可能使用这种形式的for替代传统的for形式。
2.4.7 break
break语句有两种形式:标签和非标签。在前面的switch语句中,看到的break语句就是非标签形式。可以使用非标签break结束for、while、do-while循环,例如:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P72_54648.jpg?sign=1739077294-HMmFpzbaMeV2ql5Yk26rRPiCKAM0njBg-0-f73eafdbba02392213d1d09effb919ba)
这个程序在数组中查找数字12。当找到值时,break语句会结束for循环,控制流跳转到for循环后面的语句。程序输出是:
Found 12 at index 4
无标签break语句结束最里面的switch、for、while、do-while语句,而标签break结束最外面的语句。接下来的程序(BreakWithLabelDemo)类似前面的程序,但使用嵌套循环在二维数组里寻找一个值。值找到后,标签break语句结束最外面的for循环:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P73_54652.jpg?sign=1739077294-93Z2TBttZP4z0Ol9hrxTMSGr9n2ZoaJe-0-d3c3ffcfb04059fe803dc49cfb3c41ce)
程序输出是:
Found 12 at 1, 0
break语句结束标签语句,不传送控制流到标签处。控制流传送紧随标记声明。
注意
Java没有类似于C语言的goto语句,带标签的break语句实现了类似的效果。
2.4.8 continue
continue语句忽略for、while、do-while的当前迭代。非标签模式忽略最里面的循环体,然后计算循环控制的boolean表达式。接下来的程序(ContinueDemo)通过一个字符串计算字母“p”出现的次数:如果当前字符不是p,continue语句跳过循环的其他代码,然后处理下一个字符;如果当前字符是p,程序自增字符数。
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P74_54655.jpg?sign=1739077294-vgxBtECAmfRvGkWEjFLofhEABI2l62qo-0-7e6fdc11a85f5c2c7ae90eac0c987b46)
程序输出:
Found 9 p's in the string
为了更清晰地看出效果,尝试去掉continue语句,重新编译。再跑程序,count将是错误的,输出是35,而不是9。
带标签的continue语句忽略标签标记外层循环的当前迭代。下面的程序例子(ContinueWithLabelDemo)使用嵌套循环在字符串的子串中搜索子串。需要两个嵌套循环:一个迭代子串,一个迭代正在被搜索的子串。下面的程序ContinueWithLabelDemo使用continue的标签形式忽略最外层的循环。
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P75_54659.jpg?sign=1739077294-eNey5m1D7FT4mnmEGbRADhiAjM9pT354-0-ec92f7912fa6b0a31397d83b4f5477cf)
这里是程序输出:
Found it
2.4.9 return
最后的分支语句是return语句。return语句从当前方法退出,控制流返回到方法调用处。return语句有两种形式:一个返回值,一个不返回值。为了返回一个值,简单在return关键字后面把值放进去(或者放一个表达式计算):
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P76_54660.jpg?sign=1739077294-9cxp8hbGcbs7CNbwTAlHrvV4sKiYF4yh-0-765b6b4a51e9114466c0deed7ee85de3)
return值的数据类型必须和方法声明的返回值类型符合。当方法声明为void时,使用如下形式的return不需要返回值:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P76_54661.jpg?sign=1739077294-AZIqj1yKEYTH3olsOvK1FLUsN5Ii9OXw-0-2f2635527c7ba7c883629db3d3b34a59)