![Java无难事:详解Java编程核心思想与技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/35011059/b_35011059.jpg)
2.7 程序结构
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_84.jpg?sign=1739525396-2ZxLyt94GGjVkRzgYtPCRm3IObRPrrdZ-0-71af91bc5890309509381c1b3664e7d4)
扫码看视频
Java的程序结构基本上是从C++中沿用而来的,不过随着Java本身和技术的发展,Java在这方面还有一些小的改进。
从结构化程序设计角度出发,程序有三种结构:
● 顺序结构
● 选择结构
● 循环结构
1.顺序结构按照代码的先后顺序依次执行,先执行A,再执行B,如图2-2所示。
2.选择结构:存在某个条件P,若P为真,则执行A,否则执行B,如图2-3所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_85.jpg?sign=1739525396-8PE8XVZXDXPAKU43lprTgSgppXoocBoV-0-604f83c0b135160d2ce8fa9a84e3d873)
图2-2 顺序结构
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_86.jpg?sign=1739525396-2dGOtkZSXH3tBSmS9DO7LXHliW25JIS3-0-b1d9ef097bc7cb120e50f5f5544aa279)
图2-3 选择结构
由选择结构可以派生出另一种基本结构——多分支结构,如图2-4所示。
3.循环结构分为两种:当型和直到型。
(1)当型:当P条件成立时(为真),反复执行A,直到P为假时才停止循环,如图2-5所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_87.jpg?sign=1739525396-YjcfipHPJyGd2yH15Kj7ELLZYVSTC9GK-0-4d139bece96e65daa6a67f9c0f76df1d)
图2-4 多分支结构
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_88.jpg?sign=1739525396-9yyx9islPZCrQgfS35GGOg22MfUz7xhK-0-41023e27f077d5fcbb11a0d588aaba7b)
图2-5 当型循环
(2)直到型:先执行A,再判断条件P,若为真,再执行A,如此反复,直到P为假,如图2-6所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_89.jpg?sign=1739525396-C5HeSnx1Vr8X5aITW9i6fdmxTwYUyu4q-0-904a31c463fbf31e3184b60541cbce2e)
图2-6 直到型循环
2.7.1 分支语句
分支语句实现程序流程控制的功能,即根据一定的条件有选择地执行或跳过特定的语句。Java中的分支语句有两种:if/else语句和switch语句。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_90.jpg?sign=1739525396-fMcwVyzjP765VpDsfus5WMFli4nGj7yj-0-d3844ced76cfc81cbccbc6d3e75791a9)
扫码看视频
1.if语句
if语句有以下三种形式。
形式1:if(boolean类型表达式)语句A
当表达式的值为true时,执行语句A,否则跳过语句A。执行流程如图2-7所示。
例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_91.jpg?sign=1739525396-rZfUH0LsCeUfIhXTVM2jk7NlYCrWnpBd-0-4baa921e62df6f5dccba7f152eaaf3ee)
形式2:if(boolean表达式)语句A else语句B
当表达式为true时,执行语句A;当表达式为false时,执行语句B。执行流程如图2-8所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_92.jpg?sign=1739525396-3Py8vZRvmuAM5jlT7Jl5kDmOBb9d0z67-0-a9b86865e8f76b210ccb4a73f0e93dd2)
图2-7 if语句执行流程图
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_93.jpg?sign=1739525396-WmAXiNDXPpVXxhASlOvJNBlFurVHhddT-0-4bdb16148bf17d6d6a7c00bc613159ba)
图2-8 if/else语句执行流程
例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_94.jpg?sign=1739525396-YBvBaVVD0DT5mUmVo7uTLFaUcIYoN3jk-0-61f6f80c72cec41774d9601c223402e1)
形式3:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_95.jpg?sign=1739525396-4Z0M5HKpvZCWGtxh99b95waCNyCIu264-0-0e9deb58bc6eae93649ca528d8df7660)
执行流程如图2-9所示。
例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_96.jpg?sign=1739525396-RPYQgMfoIOhVPQy1W2VBdjC9Ijtq7NLp-0-9ddc0cd3a3348e4f0d6fad7215bf4209)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_97.jpg?sign=1739525396-NIGJs61ALmqNBYx4TEKFUmKdckvEgU9S-0-e249866d97b041b5626e78d377da9f1d)
图2-9 if/elseif/else语句执行流程
上面这个代码是一个典型的if/elseif/else语句的示例,逻辑很简单,就是根据学生成绩打印输出成绩评价。if、elseif和else是互斥的条件判断,如果一个条件满足,后面的条件就不会再去判断。假设score变量的值是70,因为它不满足第一个条件,所以才会进行第二个条件判断(score >= 60),而该表达式计算为true,于是输出:及格,之后的else不会被执行。同理,如果score变量的值是90,那么第一个条件就满足了,输出:优秀,之后else if条件根本不会进行判断,else后的语句也不会被执行。
if语句也可以嵌套使用,一般的形式为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_98.jpg?sign=1739525396-xQjljiu28YbWHRkkxinG3wTwYlyjDdsC-0-a87d34dbe5ec1114d2aa9fca6311c1c4)
注意:else总是与最近的if配对的。
注意:在Java语言中,if语句只接受boolean类型的条件值,或者返回boolean类型的表达式。在C++中,我们可以使用非0值来代表true,0代表false,但是在Java中这种方式是不允许的。当然,这一规则也适用于while、do…while循环。
2.switch语句
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_99.jpg?sign=1739525396-mvp3axPqmPjaspV14AVzmv6m3IIRFgKh-0-208e1eaa2ced7e94abdaf143010cbeb3)
扫码看视频
switch语句的语法结构如下:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_100.jpg?sign=1739525396-kCNzpRuqMfajWkdoOGrQUXPThoqjuWns-0-93455507456ee985d4b32d1f1c2860da)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_101.jpg?sign=1739525396-7vVZCcAKk6EQALsFRGisj1bJXd1YZ04n-0-3b2086234deb40a133196ea17dae624a)
switch语句根据表达式计算的值,与case后的常量值进行比较,当相等时则执行case中的代码。如果所有的case子句都没有匹配成功,则执行可选的default子句中的代码。这里有以下三个知识点需要注意:
(1)switch语句的表达式的类型在Java 5之前只能是byte、short、int或者char类型。Java 5在新增了枚举类型,以及自动装箱与拆箱特性后,switch语句表达式的类型也扩充为支持枚举、Byte、Short、Integer和Character。在Java 7中,又进一步增加了对字符串类型(String)的支持。
(2)case后接的是常量,不能是变量,且所有case子句中的值应是不同的。
(3)default子句是可选的,一般用于在没有匹配成功时执行默认的操作。
我们注意到,在switch语句的所有case子句和default子句中都有一条break语句,该语句是用来在执行完一个case分支后使程序跳出switch语句块的。为什么在switch语句中要使用break语句呢,这是由switch语句特有的工作方式来决定的。我们看代码2.14。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_102.jpg?sign=1739525396-BKVo9nCBRRQXgwOWBtx8jFSSBhxzKR9l-0-ce24351b742661e19dc98abf2ec3e87f)
在本例的switch语句中没有使用break语句,执行结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_103.jpg?sign=1739525396-hFVBHYfEj1GZm8H3tWn70BPFPA7rCqg6-0-fad5af4e40d3b1fae91c43df597934b4)
变量a的值是3,于是从case 3开始,后面的代码会一直按顺序执行下去,而不会再去匹配,于是,“4th、5th、Out”也被输出到控制台了,这就是switch语句的工作方式。
为了避免出现这种情况,我们需要在每一个case子句后面都添加一条break语句,用于在匹配成功执行完代码后终止switch语句。修改上述代码,如代码2.15所示。加入break语句后,程序运行的结果就符合预期了:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_104.jpg?sign=1739525396-l4L6cc8Jn6SArvk43uQjioRkjfJwZpeK-0-5c3f9924fda18686656ada85b55f5143)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_105.jpg?sign=1739525396-czNE00bB1KOAMD9qZh56pWTIuw3DrHpj-0-12ec69e64ef65fd02554fe8d728828e0)
有的读者可能会奇怪:为什么default子句中也要添加break语句呢?首先要明确一点,default子句虽然经常书写在最后,作为没有匹配成功后的默认操作,但该子句并没有强制要求一定要书写在最后。换句话说,你在default子句后依然可以继续添加case子句,在这种情况下,为default子句添加break语句就是必要的。总之,为switch语句中的每个子句都添加break语句是一个良好的习惯!
在某些场景下,我们也可以利用switch语句的工作方式来简化代码的编写,例如switch的表达式有多个值对应了相同的处理结果,那么我们可以将处理代码放到最后一个匹配的case子句中,只在该子句中使用break语句,如代码2.16所示:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_106.jpg?sign=1739525396-sQ9yU1DEbPs66oqfqhuVtwkmXVmtUlHp-0-d1d935f07c34699467adda08da605131)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_107.jpg?sign=1739525396-vmkvpicxJOfCxi481ZWq9B40JnxMDKb5-0-e4c5cd0dd7af345a20e1e880aaf11ef1)
code的值是字符串“201”,与第一个case子句的值匹配,但是该子句没有代码,也没有break语句,于是继续往下执行,直到case "203"下的输出语句后有break语句,终止了switch。这段代码的目的就是在code的值为字符串“201”“202”或者“203”时都输出:成功。
提示:代码2.16需要在Java 7及之后的版本中才能编译运行,因为Switch语句对字符串类型的支持是在Java 7中才引入的。
2.7.2 循环语句
有个笑话,一名记者采访一群南极企鹅,记者问,“你们每天都做什么呢?”企鹅们都回答“吃饭、睡觉、打豆豆”,当问到最后一只企鹅时,它说“吃饭、睡觉”。记者很奇怪,问“你为什么不打豆豆呢”,结果这只企鹅满脸悲愤地说“我就是豆豆”。
这个笑话只是为了让读者轻松一下,但也说明在我们生活中有很多周而复始的行为,比如学生,“起床、上学、做作业、睡觉、起床、上学……”,程序也一样,有很多重复的工作要执行,这就需要使用循环了。
循环语句用于在循环条件满足时,反复执行特定的代码。循环语句一般由4个部分组成:
● 初始化部分(init_statement)
● 循环条件部分(test_exp)
● 循环体部分(body_statement)
● 迭代部分(alter_statement)
在Java中,循环语句有四类:
● while循环
● do…while循环
● for循环
● “for each”循环
1.while循环
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_108.jpg?sign=1739525396-lJ8qOOhjVtmxPYHi0SsX9vLdFdEnnmH1-0-faed0d46d4b7999619a19cd307778b67)
扫码看视频
while语句是Java中最简单的循环,它是一种“当型”循环,其语法格式为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_109.jpg?sign=1739525396-J8lTIGdmClDsvdZBuyGQg8m0KIzaERoQ-0-c583315490208048994c0787e7005c87)
condition是一个类型为boolean的条件表达式,当该值为true时,则执行statements,然后再次判断条件并反复执行,直到条件不成立为止。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_110.jpg?sign=1739525396-OxCNP3HbIlGXNsFsd5s3AVvSXjLnK0Qi-0-33e7d981e5889d777fd7c06616498d6e)
图2-10 while循环
while循环在循环开始就判断condition条件,所以,statements的执行次数是0~n。
while后面的语句一般为语句块,即需要使用一对花括号({ })来包裹语句,语句块中应该有让condition为false的语句,否则就会出现无限循环,即我们常说的死循环。while语句的完整形式如下:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_111.jpg?sign=1739525396-f47qqVNNl69y3XSeCj7Ght4wkDJX2ukx-0-4a9fb9bf8cc6788d9f5eb22161128869)
下面我们通过while循环计算1+2+3+…+100的结果,代码如2.17所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_112.jpg?sign=1739525396-6nkc4iLBcAVyn6L3WXQjmco6081biAr0-0-832f7449c498df71f58d0e38c2895543)
输出结果为:1加到100的结果为:5050
2.do…while循环
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_113.jpg?sign=1739525396-vZG2aCr1hXEKpMienDG59F0ItSDJcB0X-0-629c25ef98460119741327a20ec10ef5)
扫码看视频
do…while循环是一种专门的“直到型”循环语句,该循环的语法格式为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_114.jpg?sign=1739525396-oYVeLn9jrkj606T1fc1kF0geSoq4PTwp-0-3446dbedac934cf6e17a8d44ce769b5b)
先执行statements,再判断condition条件的值,如果为true,则继续执行statements,否则结束循环。
do…while循环的执行流程如图2-11所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_115.jpg?sign=1739525396-zCN43FZKvCGTrIDUBj7p3E8R3kAQ5gE3-0-bc1e2771e91e0aaf4cbfa26cf9077a70)
图2-11 do…while循环的执行流程
与while循环不同的是,do…while循环执行statements的次数是1~n。所以当我们需要至少执行一次代码时,使用do…while比较方便。
do…while语句的完整形式如下:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_116.jpg?sign=1739525396-mNpiYiurM3z9Yo1pj9ZzsySGaxT7PxwY-0-75dfe001551cd800d1d88c1e012fa1cb)
下面我们使用do…while循环来计算1+2+3+…+100的结果,代码如2.18所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_117.jpg?sign=1739525396-dPfcbR1DkjYJn1pq4E2aRWGrqGgAKZlx-0-853cf6dd5e4c58a30ab755802bc06f14)
输出结果同代码2.17。
3.for循环
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_118.jpg?sign=1739525396-EnJzr5l0WgngCAQcCsSrCYs83dMa251k-0-112048b2f0e3c60e8ef7e8c0238781bb)
扫码看视频
for循环是一种使用频率非常高的循环,它的语法格式为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_119.jpg?sign=1739525396-uohkHn6QlPRFCRTBJHrRtBfulzNUvDQX-0-b0ddd024e201421be345b9a27b798239)
在for循环的圆括号中有3个表达式,第一个表达式init_statement通常用于对循环计数器进行初始化;第二个表达式test_exp代表条件部分,该部分在每次循环时都要进行计算和判断;第三个表达式alter_statement通常用于更新循环计数器;body_statement就是每次循环条件满足时要执行的循环体部分。
for循环的执行流程是:首先计算init_statement,接着执行test_exp,如果值为ture,则执行body_statement,接着计算alter_statement,再判断test_exp的值。依次重复下去,直到test_exp的值为false。从这个过程中,我们可以知道init_statement部分在整个for循环中只执行一次,而其他部分则会在条件满足时,多次重复执行。
图2-12给出了for循环执行流程。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_120.jpg?sign=1739525396-jPoqKZzrd3G6f4whzVgLaVB8ojlNiXCC-0-1ccd6992b5a29e1f3f4064c2b96ea1ce)
图2-12 for循环的执行流程
下面的代码将数字1~10输出到控制台窗口中。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_121.jpg?sign=1739525396-EgGGeU2n1OF4MsevRjUfYB5k3sqj10Nt-0-58d7e33d952fe7707b9e038b3281ce80)
当在for语句的初始化部分声明计数器变量i时,i变量的作用域仅限于for循环内部,如果在for循环外部访问i变量,则会出现编译时错误。
下面我们使用for循环来计算1+2+3+…+100的结果,代码如下:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_122.jpg?sign=1739525396-dd14cfC5e7FYUs6F5e6vgGsGH0NaaFWC-0-97cb28ca4537f797321e0db47dafabd3)
可以看到使用for循环代码更加简洁。
for循环在使用时有一些特例,具体如下。
(1)for语句的第一部分可以省略,例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_123.jpg?sign=1739525396-Xk2oZQag4ZDhZ3yGSjnGz6DtOn2skSfn-0-7a1cbf8e7f5a2475bd0dd85113edc967)
(2)for语句的第二部分一般不可以省略,否则就会变成无限循环,例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_124.jpg?sign=1739525396-HrYf7qCLHafXixj8STSW1hpsfOQ3CjgF-0-7f5fa34e9eb18ff47abcd814bf661586)
(3)for语句的第三部分也可以省略,但在循环体中必须有语句修改循环计数变量,以使条件表达式在某一时刻为false,从而正常结束循环。例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_125.jpg?sign=1739525396-Y9sR8udiNd4XbjHfnbYkDz286POTqjzt-0-cf89f8d91ea6c18ad811b1bfa469707f)
(4)如果同时省略for语句的第一部分和第三部分,则相当于while循环语句。例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_126.jpg?sign=1739525396-Ra7qsBsHLPJG2I2RZvVtgAGm63bgH2Li-0-5a24c21544e502b26c488540903ecabd)
(5)如果将for语句的三个部分全部省略,即for(; ;),则相当于while(true)语句。
(6)for语句的第一部分和第三部分还可以是复合的表达式,以使循环计数变量值在修改时可以对其他变量进行赋值。例如:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_127.jpg?sign=1739525396-cH5bW3Cw8bvmQ8DdbHDZ7aGW9dXqT18d-0-4dc0cbdbca551ce798bb65dfaec00b43)
4.“for each”循环
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_128.jpg?sign=1739525396-SZ3RQxwfT5XUZAtJufrJhAVyYQqp8dJF-0-ff04585c786f27502bb3f95377e32c3a)
扫码看视频
Java SE 5.0引入了一种新的“for each”循环,提供了一种简便的方式来遍历数组或集合中的各个元素。
这种for循环的语法格式为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_129.jpg?sign=1739525396-gEOsZ8Iv3f1IxdHOFRO775LJLuPvekdB-0-15bf9cb250a1c04036e6a7fde2354187)
“for each”循环语句由两部分组成,并用冒号(:)分隔,在冒号前定义一个变量(type variable),用来临时存储数组或集合中的各个元素,在冒号后的内容是要遍历的数组或集合对象(array/collection)。“for each”循环在遍历数组或集合时,会将数组或集合中的每个元素都取出并赋值给我们定义的临时变量variable,在循环体中,可以直接通过variable来得到数组或集合中的各个元素并进行处理。
关于“for each”循环,我们会在介绍数组和集合时有更进一步地讲解,下面我们看一个例子,如代码2.20所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_130.jpg?sign=1739525396-yuIRtcOc6lqpLjyj2uMPuSMaZAmLSLYO-0-d0a74b59eade55861348aa0fa56bc4ef)
不带ln后缀的print方法不会输出换行符。
程序的运行结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_131.jpg?sign=1739525396-w4cxdVkRBBuYHBlagUVbjjCSqB1j6UAs-0-5847ede3a494f15f388b706dded91de5)
可以看到,使用“for each”循环来遍历数组是非常简单的,不过要注意的是,在“for each”语句中定义的临时变量的类型要与数组或集合中的元素类型相匹配。
“for each”循环虽然可以让代码更加简洁,让我们在使用时更加方便,但它也有局限性,主要体现在:
(1)只能按顺序遍历所有元素,无法实现较为复杂的循环,如在某些条件下需要回退到之前遍历过的某个元素。
(2)循环计数变量不可见,不能通过下标来访问数组元素。
(3)在遍历集合时,集合对象必须已经实现了Iterable接口。
5.break语句和continue语句
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_132.jpg?sign=1739525396-JJY7O4V8JaaLksHMJWINFpPLiUz8y14t-0-bf4e575fa586ff6016e8031779ca1ac1)
扫码看视频
break语句和continue语句主要用于控制循环语句的流程。
(1)break语句
在switch语句中我们已经使用过了break语句,其用于结束switch。同样,在循环语句中也可以使用break语句来退出循环。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_133.jpg?sign=1739525396-YQbTyIOrhFk8BPQYBOBIoqDvclW9Xplc-0-972b69409a6bd6e8e1fcf9232115f21d)
在上面的例子中,while循环的条件恒为true,因此while循环内部的代码将永远重复地执行下去。i这个变量会从0一直往上增长,直到无穷大。“System.out.println(i);”这行代码也许永远都无法执行。难道就让CPU一直做这种没有意义的工作吗?我们并不喜欢这种无限循环。
if语句来了,它带着break语句来解救CPU了。当i大于10的时候,break语句大吼一声:“不要继续了,我受够了,这一切该结束了!”于是while语句建立的一个延续千秋万代的循环被打破了。最高兴的应该是“System.out.println(i);”这行代码,它终于有机会大显身手了。
上面程序的运行结果是:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_134.jpg?sign=1739525396-dovOJN8egD5CBguzlUFvznDnv5ijAjxH-0-8bb70035bd2c8c651830df5ed278142d)
如果在嵌套的循环中使用break语句,那么它将退出整个循环,还是只退出当前循环呢?我们可以通过下面的例子来验证一下。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_135.jpg?sign=1739525396-kb9VED3nySAI7w5B54VYnbz5XrHjSWMC-0-3c15c8371d0377f564e9c064bb985195)
程序运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_136.jpg?sign=1739525396-OeNDAxsKtSeJ9lC4BQ0Khmr2uo93xcCn-0-ba2b1a56f17a235028fd6dc7d784f573)
从结果中可以得知,在嵌套的循环中,break语句只是退出当前循环。有时候我们希望能够在某个条件触发的时候直接退出指定的循环,这可以使用带标签的break语句来实现。
标签放置在需要跳出的循环之前,后面紧跟一个冒号(:),修改代码2.21,在最外层循环前面添加一个标签,并使用“break标签名”的形式跳出循环,如代码2.22所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_137.jpg?sign=1739525396-TQz7kWE9mhIiQBpIj7cXB6nmknR8OKhB-0-ac3699616348e2556f7c5d2d7542953c)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_138.jpg?sign=1739525396-Nq5aaZiTmFhgV7U53NL4yRmpeLpzG43L-0-aea163618a486cecf144671a3ed62c7a)
程序运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_139.jpg?sign=1739525396-HLn1v9IOr6GToMp5mLZzfBcm7Ypo4wOP-0-56bbf2e50b4f386256c5f3b05c88922c)
(2)continue语句
continue语句用于跳过当前循环的一次执行,注意与break语句的区别,break是退出当前循环,而continue仅仅是跳过本次执行。
我们看下面的代码:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_140.jpg?sign=1739525396-skNqvBu2ZSfMmTBLj3mzFbYevzkkeJqa-0-3c808cafc4ecbea14f9c4cfa7ea5340d)
这个程序运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_141.jpg?sign=1739525396-barcxYHWlrK6CorryiNT7KivkrflquyL-0-42f264d65215f7e36274ba6c0aed5ed0)
在上面的程序中,当i是2的整数倍时(i除以2余0),continue被执行,当continue执行后,后面两行向控制台输出数据的代码就不会被执行了,程序转而从for语句的i++表达式开始,进行下一次循环。
当continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环的本次执行。
下面我们看一个求素数的例子。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_142.jpg?sign=1739525396-h6Q7JanJeZwuupdo0K5bNlWKlnbN7xVZ-0-f05232c651a7304bd91c54589949a66c)
程序的运行结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_143.jpg?sign=1739525396-Vr9lROkgv2gUdfeJkiFqixesDCEPO7F6-0-63a394e7895ec89ca82cd33ba2aece3a)
请读者自行编写一下上述程序,然后仔细理解代码中的含义,就能掌握continue语句的用法了。即使一时理解不了continue语句的用法,也没关系,因为我们通过其他代码逻辑也能实现continue语句能实现的功能,所以读者可以放宽心,不用刻意强求理解continue。
下面,再用一个例子熟悉一下break语句和continue语句。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_144.jpg?sign=1739525396-7t3NW3HM0fL6fVfbywcFEjnv8DmzXjae-0-d786ea7662ef3119e7accc879116a285)
程序运行结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt002_145.jpg?sign=1739525396-nTDuNggPiBznqrzN2kwSY6R7AbOMXdfl-0-c63af943a1dece27cee370fa32441e69)