![Java编程指南:基础知识、类库应用及案例设计](https://wfqqreader-1252317822.image.myqcloud.com/cover/948/31169948/b_31169948.jpg)
1.6 Java程序流控制语句
Java程序流控制语句是用来控制程序走向的,程序流控制语句是在Java程序中通过该语句执行一段程序流,程序流可以是由单一语句(例如表达式等)或是由复合语句组成的,每条完整语句的结束是以分号为标志的。
Java程序流控制主要分为两部分,分支(选择)和循环控制语句。语句使用的关键字有:分支结构控制关键字(if-else、switch-case),循环结构控制关键字(for、while、do-while),以及控制分支和循环程序流执行方向的辅助关键字(break、return、continue)等。
1.6.1 分支结构语句
分支结构程序设计提供了一种控制机制,使得程序的执行可以跳过一些语句不执行,而转去执行另一些语句。“分支”由条件控制,“条件”由逻辑或关系表达式组成,逻辑或关系表达式运算的结果true和false决定程序执行的方向。
1. if-else分支结构
if-else语句使用的语法格式为
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P41_14714.jpg?sign=1739284955-MCq3nm6d9Hyofu7QXTSIRnhe0iVqhzwG-0-29fde689c78ea8110ca81833e49a15da)
if-else语句的功能是根据判定条件真假执行两种操作中的一种。逻辑表达式boolean-expression是任意一个返回布尔型数据的表达式,如果逻辑表达式值为true,则程序执行statements1语句,否则执行statements2语句。语句statements1,statements2可为单一语句,也可为复合语句,复合语句需要用“{}”括起来,“{}”外面不加分号。else子句是可选语句,else子句不能单独作为语句使用,需要与if配对使用,else总是与离它最近的if配对,可以通过使用“{}”改变if-else的配对关系。
使用if-else语句的原则是:尽可能在if的逻辑表达式内使其出现“为真”的概率大,可以人为判断事件发生的概率,这样做是避免执行else以及else内嵌套的if-else语句,提高程序执行效率。另外,在if逻辑表达式内应尽可能避免使用否定表达式。
【示例1-23】 比较两个数大小,并显示输出数据大的数。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P42_14715.jpg?sign=1739284955-a2ky3YznQQYndi7xexodoHmoNqAxGx46-0-6c1d2af3bc7ce35ec2e0bff4b8e54458)
2. switch-case分支结构
switch-case(多分支或开关)语句使用的语法格式为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P42_14717.jpg?sign=1739284955-jiwpZIUiFcLCAP3s5lv3rHcRbBlSQf23-0-84c05df788b95c9d521789c1b6a75a4b)
switch-case语句的功能是根据表达式expression的值迅速执行程序的不同部分,switch语句的作用域是该语句后的大括号{},在大括号中的语句都与switch有关,它们属于switch语句。switch语句根据表达式expression的值确定执行多个操作中的一个,表达式expression的值可以是任意一个基本数据类型的数值,switch语句把表达式运算的数值与每一个case子句中的数值相比较。如果匹配成功,即表达式所得结果等于case子句中的数值,则执行该case子句后面的语句序列。
case子句中的数值expression_ValueN是一个常量,而且所有case子句中的常量数值都是不相同的;default子句是任选项,当表达式的数值与任何一个case子句中的数值都不匹配时,程序执行default后面的语句,如果表达式的数值与任何一个case子句中的数值都不匹配并且没有default子句,程序不进行任何操作,而是直接跳出switch语句的作用域。case子句只起到一个标号作用,用来查找匹配的入口点,从此处开始执行程序,对后面的case子句不再进行匹配,而是直接执行case后的语句序列,因此应在每个case分支后用break语句终止后面case分支语句的执行。在一些特殊情况下,多个不同的case数值要执行一组相同的操作,这时可以不用break语句。case分支中包括多个执行语句时,可以不用大括号{}括起来。
break语句用来在执行完一个case分支后,使程序跳出switch语句的作用域,即终止switch语句执行。
【示例1-24】 根据整数变量i的内容决定执行哪段程序段。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P43_14719.jpg?sign=1739284955-GxPQrC8RwawwDitCoNdqnRFuLq8qRo61-0-9fc0a471c8cdfb2ec7ff90ca0a563c64)
上述程序中整数变量i内容为0时,与case 0:语句的常量0相匹配,因此执行System. out.println("i is zero.")语句,每条case语句后的break语句的功能是跳出switch语句的作用域。
另外,switch语句的功能可以用简单的if-else来实现,但在某些情况下,使用switch语句更为简练,可读性强,而且提高了程序执行的效率。
1.6.2 循环结构语句
Java语言提供的循环语句有for、while和do-while语句,循环语句的作用是反复执行一段代码,直到满足终止循环的条件为止。一个循环一般应包括4部分内容:初始化部分(initialization),用来设置循环的一些初始条件,例如计数器初始值设置为0等;循环体部分(body),反复循环执行的一段代码,可以是单一语句,也可以是复合语句;迭代部分(iteration),在当前循环结束、下一次循环开始时执行的语句,该语句常用来使计数器完成加1或减1的操作等;终止部分(boolean_termination),通常是一个布尔表达式,每次循环时要对该表达式求值,以验证是否满足循环终止条件。
1. For循环结构
for语句使用的语法格式为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P44_14721.jpg?sign=1739284955-Rqb53tmcytNESyN7sXnjvLNMWNVYDt2W-0-a9fd07b1d43343dd261b1a1c7b9ad260)
for语句的功能是执行循环体语句N次,N由表达式initialization(初始值)和boolean_ termination(终止条件)和iteration(迭代部分)的数值决定。for语句通常用在循环次数确定的情况下,也可根据循环结束条件执行循环次数不确定的情况。
for语句的执行过程为:首先执行初始化操作,然后判断终止条件是否满足,如果满足循环条件,则执行循环体中语句,最后执行迭代部分;每完成一次循环,重新判断终止条件,如果满足终止条件,则退出for循环语句。
for语句的作用域是该语句后的“{}”,在大括号中的语句都是循环体语句,如果for语句后没有“{}”,for语句的循环体最多只能有一条语句,在for语句初始化部分中可以声明变量,但该变量的作用域(操作该变量)只是在整个for语句确定的作用域中。
【示例1-25】 使用标准for语句的应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P44_14722.jpg?sign=1739284955-XE9I4bXAHUWdr50LeBQS77YZfXtI6Xz6-0-60a12943d171b4e307dfea1fbb912a46)
在上例中,初始化部分为声明一个变量i,并为i赋予初始值0,含义是该循环从i等于0开始,循环的终止条件是i小于等于10,它是一个逻辑表达式,其值为true时执行循环体内的语句,否则退出循环,迭代部分的表达式为变量i加1,每循环一次,该部分被执行一次,for语句的循环体内容为System.out.println("i="+i)。
另外,在for语句中,初始化、终止及迭代部分都可为空语句,但分号不能省略,三者均为空时,相当于一个无限循环。下面是无限循环for语句代码:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P44_3329.jpg?sign=1739284955-VYUrrE72TKCoxUDwHZD7tl2vvAbHRNKs-0-e0fe1fe1ae65319d8bfb400e2695beca)
for循环语句是可以嵌套使用的。
【示例1-26】 嵌套使用的for语句的Java程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P44_3331.jpg?sign=1739284955-JV1OH9u7bmUjRwKrrQp9zAtbEbR5D2F5-0-d0bd1873b25bb6e116525704d8f2a6ed)
for语句的初始化部分和迭代部分可以使用逗号语句,逗号的作用是分隔在初始化和迭代部分的表达式语句。有时一个循环可能需要多个变量控制,即循环的终止条件是由多个变量的逻辑表达式组成的,其多个变量的初始化和迭代处理通过逗号就可以编写在一个for语句中。
【示例1-27】 多重循环的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P45_14772.jpg?sign=1739284955-pFgKtfPcfOawxmzShJjKjqVDNoYcehVI-0-4cf596f371ab7e89622872ebd2d9f8d6)
上述程序是通过两个变量控制for循环的,当i小于j时循环,其输出结果为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P45_14773.jpg?sign=1739284955-6Lk4vV03Z0mqRsLq57XbErEye0XyVMIr-0-10b74d6c7d9974974e2a07fda5a37810)
2. while循环结构
while语句使用的语法格式为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P45_14774.jpg?sign=1739284955-3PJ3CG6ag3lbRpjBr8kACiqdEWmFRsAN-0-d1595f204d449ed663ae19341f795acf)
while语句的功能是执行循环体语句N次,N由逻辑表达式boolean_termination(终止条件)的数值决定。
while语句的执行过程为:首先计算终止条件,当终止条件为true时,执行循环体中的语句,否则退出while循环语句。while语句的作用域是该语句后的大括号{},在大括号中的语句都是循环体语句。当最初终止条件为false时,while循环体中的语句将不被执行。
while语句的初始化部分和迭代部分是任选项,初始化部分在while语句作用域外,迭代部分在while循环体内。
【示例1-28】 使用标准while语句的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P46_14775.jpg?sign=1739284955-2VVBJGJafUk9yCLk99K5QARrtd31GkgL-0-587c36bea73bd973a0f06bbfafa68482)
另外,在while语句也可以实现无限循环。下面是无限循环while语句代码:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P46_3343.jpg?sign=1739284955-4tPCsZbCoxScwJZPpTmT4VpjAPxENWBH-0-06fc993c60dcdcf8a379cd1636976d19)
3. do-while循环结构
do-while语句使用的语法格式为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P46_14776.jpg?sign=1739284955-uWfyNAjD1d6t28jcjf9L0SFykvf8Ieiq-0-afc6e1c8a9e431e7f903dd632daa8463)
do-while语句的功能是执行循环体语句N次,N由逻辑表达式boolean_termination(终止条件)的数值决定。
do-while语句的执行过程为:首先执行循环体内的语句,然后计算终止条件,当条件为true时,继续执行循环体中的语句,否则退出do-while循环语句。do-while语句的作用域是do语句后的大括号{},在大括号中的语句都是循环体语句,do-while循环体中的语句至少被执行一次。
do-while语句的初始化部分和迭代部分是任选项,初始化部分在do-while语句作用域外,迭代部分在do-while循环体内。当终止条件为true永不改变时,do-while为无限循环语句。
【示例1-29】 使用标准do-while语句的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P46_14777.jpg?sign=1739284955-tmq7RULEszhXU3O3W7ICzac0yQ5rNi5P-0-5236e607ea8873b5aa2ef321f2fea0a0)
1.6.3 辅助流控制语句
Java语言提供了一些辅助控制分支和循环程序流执行方向的语句,例如,break、continue、return等语句,break语句可以从switch-case分支结构中跳出,以及从循环体中跳出;continue语句可以跳过(不执行)循环体中的一些语句,或者退出循环体;return语句是方法体的返回语句,主要应用于方法体中,但也可以辅助控制分支或循环程序流的执行,即可以中断分支或循环体。
1. break语句
break语句使用的语法格式为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P47_14780.jpg?sign=1739284955-uk7opewIoE6AxmNEKeowSP5RWJA09k6o-0-7a0ddd88b43d4cc83273daf34092c423)
break语句的功能是停止执行一些语句而转向执行另一些语句,break语句主要用于跳出switch语句或循环语句的作用域,即不再执行switch语句或循环体中的语句,break关键字后可跟标号,由于循环体可以嵌套,即实现多重循环,因此,标号用于指示跳出哪个循环体,如果跳出当前循环体则不需要标号。
在switch语句中,break语句用来终止switch语句的执行,即不再执行switch语句作用域内的任何语句,使程序从switch语句后的第一条语句开始执行。
在循环语句中,break语句用来跳出当前或多重循环体,即不再执行循环体内的语句。
【示例1-30】 使用break语句跳出当前循环体的Java程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P47_14781.jpg?sign=1739284955-R3pFD69YlyYxhBrKGyM4D0Kt6387s5vQ-0-eda3a2ed30dfea094e580c31b124a192)
【示例1-31】 使用带标号的break语句跳出嵌套循环体的Java程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P47_14782.jpg?sign=1739284955-YuKnyNED5yhHns9CyHCj8ykiI1dKwRDf-0-12f84be11595a13011ea0580bcdfbe37)
2. continue语句
continue(继续)语句使用的语法格式为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P48_14784.jpg?sign=1739284955-vIRat96muF7III7iJVyjkN7SFwLwSvh8-0-750e1f4b093d71379997c467501f8b3f)
continue语句是使用在循环语句中的,其功能是结束本次循环,跳过循环体中一些未执行的语句,接着进行终止条件的判断,以决定是否继续循环,或者跳到Lable标号处继续执行一些语句。对于for语句,在进行终止条件判断之前,还要先执行迭代语句,用continue Lable语句可以跳转到“{}”指明的外层循环中,Lable是一个程序语句的标号。
【示例1-32】 使用continue语句的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P48_14785.jpg?sign=1739284955-cgns3I42IJBmE2h2rwkvvpF5auS6wP9t-0-4decb743500fb1cf5d2025b1ff6964ce)
3. return语句
return(返回语句)语句使用的语法格式为:
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P48_14786.jpg?sign=1739284955-fQ94MJbBV1b7VfrJ6GAlUXVOUPIvCX6X-0-aa33e9ea8319c6d5331b255d2adbe601)
return语句的功能是从当前方法中退出,返回到调用该方法的语句处,继续程序的执行,表达式expression是return语句指示的返回值,当方法声明使用void返回类型,即为空(没有返回值)时,return语句没有返回值,即不返回任何值,void类型的方法也可以省略return语句。当调用方法需要返回值时,表达式expression的数值返回给调用该方法的语句。返回值的数据类型需要与方法声明中的返回值类型一致,也可以使用强制类型转换使类型一致。
return语句通常用在一个方法体的最后,以退出该方法并返回一个值。在Java程序中,单独的return语句用在一个方法体的中间时,会产生编译警告错误,因为这时可能会有一些语句执行不到,但是可以通过把return语句嵌入某些语句(例如if-else)中使程序在未执行完方法中的所有语句时退出方法。
【示例1-33】 return作为方法返回语句的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P49_14787.jpg?sign=1739284955-glqd5PahdzLmkTRESdvoYugNihQ44VWQ-0-ca44e6937f4ea5d475baf71eccca8783)
【示例1-34】 return作为中断循环体语句的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P49_14788.jpg?sign=1739284955-kxwV0YNedG2GuC0LkfcQy5hRZMzNwJ1G-0-2f51e2dec1a9d32d692d15e921ee493c)
1.6.4 流控制语句应用示例
下面给出几个流控制语句的应用示例。
【示例1-35】 do、for、if语句混合使用的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P50_14791.jpg?sign=1739284955-Fl33JWlBVU472ojtxboa44o9Fi1QHYNs-0-702e04002ed05cd88d66318083c5c8b6)
【示例1-36】 计算1/1+1/2+1/3+…+1/100值的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P50_14792.jpg?sign=1739284955-SqCgJBbR7ECZPMYx6zDCJk0veCiXONV6-0-6ea084a1a90ae050eda13ca3956095a0)
【示例1-37】 计算n!(整数阶乘)值的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P50_3375.jpg?sign=1739284955-2OK6uiiTWcPb0CImnsi4hMLMbYwDpNjK-0-06c13451cbeca96ad675802b40841a1a)
【示例1-38】 判断某年是否为闰年的Java应用程序。
![](https://epubservercos.yuewen.com/C12A92/16888495505349906/epubprivate/OEBPS/Images/Figure-P51_3379.jpg?sign=1739284955-pp2FA5EJrxjfgkaOJ6fmGSyh6XlnJ5XG-0-c25eb49a658d4b9e930c78f0e93eb246)