JAVA入门教程: 第 四 章 流 控 制

原创 2004年07月22日 20:56:00
与 C、 C++相 同 ,Java程 序 通 过 流 控 制 来 执 行 程 序 流 ,完 成 一 定 的 任 务 。 程 序 流 是 由 若 干
个 语 句 组 成 的 。 语 句 可 以 是 单 一 的 一 条 语 句 ( 如 c=a+b; ),也 可 以 是 用 大 括 号 {}括 起 来 的 一 个
复 合 语 句 。

下 面 我 们 分 别 来 介 绍 Java中 的 流 控 制 语 句 ,包 括

1.分 支 语 句 :if-else, break, switch, return.

2.循 环 语 句 :while, do-while, for, continue.

3.例 外 处 理 语 句 :try-catch-finally, throw

最 后 我 们 简 单 介 绍 一 下 注 释 语 句 。

§ 4.1分 支 语 句

分 支 语 句 提 供 了 一 种 控 制 机 制 ,使 得 程 序 的 执 行 可 以 跳 过 某 些 语 句 不 执 行 ,而 转 去 执
行 特 定 的 语 句 。

4.1.1条 件 语 句 if-else.

if-else语 句 根 据 判 定 条 件 的 真 假 来 执 行 两 种 操 作 中 的 一 种 , 它 的 格 式 为 :

if(boolean-expression)
statement1;
[else
statement2;]

1.布 尔 表 达 式 boolean-expression是 任 意 一 个 返 回 布 尔 型 数 据 的 表 达 式 (这 比 C、 C++的 限 制
要 严 格 )。

2.每 个 单 一 的 语 句 后 都 必 须 有 分 号 。

3 括 起 。 建 议 对 单 一 的 语 句
也 用 大 括 号 括 起 ,这 样 程 序 的 可 读 性 强 ,而 且 有 利 于 程 序 的 扩 充 (可 以 在 其 中 填 加 新 的 语 句
)。 {}外 面 不 加 分 号 。

4.else子 句 是 任 选 的 。

5.若 布 尔 表 达 式 的 值 为 true,则 程 序 执 行 statement1,否 则 执 行 st atement2。

6.if-else语 句 的 一 种 特 殊 形 式 为 :

if(expression1){
statement1
}else if (expression2){
statement2
}……
}else if (expressionM){
statementM
}else {
statementN
}
@@@[
else子句不能单独作为语句使用,它必须和if配对使用。else总是与离它最近的if配对
。可以通过使用大括号{}来改变配对关系。
7.举例:
例4.1 比较两个数的大小,并按从小到大的次序输出。
@@@[
public class CompareTwo{
public static void main( String args[] ){
double d1=23.4;
double d2=35.1;
if(d2>=d1)
System.out.println(d2+" >= "+d1);
else
System.out.println(d1+" >= "+d2);
}
}
运行结果为:
C:/>java CompareTwo

35.1 >= 23.4

例 4.2 判 断 某 一 年 是 否 为 闰 年 。

闰 年 的 条 件 是 符 合 下 面 二 者 之 一 :① 能 被 4整 除 ,但 不 能 被 10 0整 除 ;② 能 被 4整 除 ,又 能 被
100整 除 。

public class LeapYear{
public static void main( String args[] ){
int year=1989; //method 1
if( (year%4==0 && year%100!=0) || (year%400==0) )
System.out.println(year+" is a leap year.");
else
System.out.println(year+" is not a leap year.");
year=2000; //method 2
boolean leap;
if( year%4!=0 )
leap=false;
else if( year%100!=0 )
leap=true;
else if( year%400!=0 )
leap=false;
else
leap=true;
if( leap==true )
System.out.println(year+" is a leap year.");
else
System.out.println(year+" is not a leap year.");
year=2050; //method3
if( year%4==0){
if( year%100==0 ){
if( year%400==0)
leap=true;
else
leap=false;
}else
leap=false;
}else
leap=false;
if( leap==true )
System.out.println(year+" is a leap year.");
else
System.out.println(year+" is not a leap year.");
}
}
运行结果为
C:/>java LeapYear
1989 is not a leap year.
2000 is a leap year.
2050 is not a leap year.

该 例 中 ,方 法 1用 一 个 逻 辑 表 达 式 包 含 了 所 有 的 闰 年 条 件 ,方 法 2使 用 了 if-else语 句 的 特 殊
形 式 ,方 法 3则 通 过 使 用 大 括 号 {}对 if-else进 行 匹 配 来 实 现 闰 年 的 判 断 。 大 家 可 以 根 据 程 序 来
对 比 这 三 种 方 法 ,体 会 其 中 的 联 系 和 区 别 ,在 不 同 的 场 合 选 用 适 合 的 方 法 。

4.1.2多 分 支 语 句 switch

switch 语 句 根 据 表 达 式 的 值 来 执 行 多 个 操 作 中 的 一 个 ,它 的 一 般 格 式 如 下 :

switch (expression){
case value1 : statement1;
break;
case value2 : statement2;
break;
…………
case valueN : statemendN;
break;
[default : defaultStatement; ]
}

1.表 达 式 expression可 以 返 回 任 一 简 单 类 型 的 值 (如 整 型 、 实 型 、 字 符 型 ),多 分 支 语 句 把
表 达 式 返 回 的 值 与 每 个 case子 句 中 的 值 相 比 。 如 果 匹 配 成 功 ,则 执 行 该 case子 句 后 的 语 句 序
列 。

2.case子 句 中 的 值 valueI必 须 是 常 量 ,而 且 所 有 case子 句 中 的 值 应 是 不 同 的 。

3.default子 句 是 任 选 的 。 当 表 达 式 的 值 与 任 一 case子 句 中 的 值 都 不 匹 配 时 ,程 序 执 行
default后 面 的 语 句 。 如 果 表 达 式 的 值 与 任 一 case子 句 中 的 值 都 不 匹 配 且 没 有 default子 句 ,则 程
序 不 作 任 何 操 作 ,而 是 直 接 跳 出 switch语 句 。

4.break语 句 用 来 在 执 行 完 一 个 case分 支 后 ,使 程 序 跳 出 switch语 句 ,即 终 止 switch语 句 的 执 行
。 因 为 case子 句 只 是 起 到 一 个 标 号 的 作 用 ,用 来 查 找 匹 配 的 入 口 并 从 此 处 开 始 执 行 ,对 后 面
的 case子 句 不 再 进 行 匹 配 ,而 是 直 接 执 行 其 后 的 语 句 序 列 , 因 此 应 该 在 每 个 case分 支 后 ,要 用
break来 终 止 后 面 的 case分 支 语 句 的 执 行 。

在 一 些 特 殊 情 况 下 ,多 个 不 同 的 case值 要 执 行 一 组 相 同 的 操 作 ,这 时 可 以 不 用 break。

5括 起 。

6.switch语 句 的 功 能 可 以 用 if-else来 实 现 ,但 在 某 些 情 况 下 ,使 用 switch语 句 更 简 炼 ,可 读 性 强
,而 且 程 序 的 执 行 效 率 提 高 。

7.举 例 :

例 4.3.根 据 考 试 成 绩 的 等 级 打 印 出 百 分 制 分 数 段 。

public class GradeLevel{
public static void main( String args[] ){
System.out.println("/n** first situation **");
char grade='C'; //normal use
switch( grade ){
case 'A' : System.out.println(grade+" is 85~100");
break;
case 'B' : System.out.println(grade+" is 70~84");
break;
case 'C' : System.out.println(grade+" is 60~69");
break;
case 'D' : System.out.println(grade+" is <60");
break;
default : System.out.println("input error");
}
System.out.println("/n** second situation **");
grade='A'; ∥creat error without break statement
switch( grade ){
case 'A' : System.out.println(grade+" is 85~100");
case 'B' : System.out.println(grade+" is 70~84");
case 'C' : System.out.println(grade+" is 60~69");
case 'D' : System.out.println(grade+" is <60");
default : System.out.println("input error");
}
System.out.println("/n** third situation **");
grade='B'; ∥several case with same operation
switch( grade ){
case 'A' :
case 'B' :
case 'C' : System.out.println(grade+" is >=60");
break;
case 'D' : System.out.println(grade+" is <60");
break;
default : System.out.println("input error");
}
}
}
运行结果为
C:/>java GradeLevel
**** first situation ****
C is 60~69
**** second situation ****
A is 85~100
A is 70~84
A is 60~69
A is <60
input error
**** third situation ****
B is >=60

从 该 例 中 我 们 可 以 看 到 break语 句 的 作 用 。

4.1.3 break语 句

1.在 switch语 中 ,break语 句 用 来 终 止 switch语 句 的 执 行 。 使 程 序 从 switch语 句 后 的 第 一 个 语 句
开 始 执 行 。

2括 起 来 的 一 段
代 码 。 加 标 号 的 格 式 如 下 :

BlockLabel: { codeBlock }

break语 句 的 第 二 种 使 用 情 况 就 是 跳 出 它 所 指 定 的 块 ,并 从 紧 跟 该 块 的 第 一 条 语 句 处 执
行 。 其 格 式 为 :

break BlockLabel;
例如:
a:{…… //标记代码块a
b: {…… //标记代码块b
c: {…… //标记代码块c
break b;
…… //will not be executed
}
…… //will not be executed
}
…… /execute from here
}

3.与 C、 C++不 同 ,Java中 没 有 goto语 句 来 实 现 任 意 的 跳 转 ,因 为 g oto语 句 破 坏 程 序 的 可 读 性
,而 且 影 响 编 译 的 优 化 。 但 是 从 上 例 可 以 看 出 ,Java用 break来 实 现 goto语 句 所 特 有 的 一 些 优 点
。 如 果 break后 所 指 定 的 标 号 不 是 一 个 代 码 块 的 标 号 ,而 是 一 个 语 句 ,则 这 时 break完 全 实 现
goto的 功 能 。 不 过 应 该 避 免 这 种 方 式 的 使 用 。    (未 完 待 续 )
4.1.4返 回 语 句 return

return语 句 从 当 前 方 法 中 退 出 ,返 回 到 调 用 该 方 法 的 语 句 处 , 并 从 紧 跟 该 语 句 的 下 一 条 语
句 继 续 程 序 的 执 行 。 (有 关 方 法 的 内 容 ,我 们 将 在 第 六 章 详 细 讲 述 。 前 面 例 子 中 的 main( )就
是 一 个 方 法 )。 返 回 语 句 有 两 种 格 式 :

1.return expression

返 回 一 个 值 给 调 用 该 方 法 的 语 句 ,返 回 值 的 数 据 类 型 必 须 和 方 法 声 明 中 的 返 回 值 类 型
一 致 。 可 以 使 用 强 制 类 型 转 换 来 使 类 型 一 致 。

2.return

当 方 法 说 明 中 用 void声 明 返 回 类 型 为 空 时 ,应 使 用 这 种 格 式 ,它 不 返 回 任 何 值 。

return 语 句 通 常 用 在 一 个 方 法 体 的 最 后 ,以 退 出 该 方 法 并 返 回 一 个 值 。 Java中 ,单 独 的
return语 句 用 在 一 个 方 法 体 的 中 间 时 ,会 产 生 编 译 错 误 ,因 为 这 时 会 有 一 些 语 句 执 行 不 到 。 但
可 以 通 过 把 return语 句 嵌 入 某 些 语 句 (如 if-else)来 使 程 序 在 未 执 行 完 方 法 中 的 所 有 语 句 时 退 出
,例 如 :

int method (int num) {
∥ return num; ∥will cause compile time error
if (num>0)
return num;
…… ∥ may or may not be executed
∥depending on the value of num

§ 4.2循 环 语 句

循 环 语 句 的 作 用 是 反 复 执 行 一 段 代 码 ,直 到 满 足 终 止 循 环 的 条 件 为 止 ,一 个 循 环 一 般
应 包 括 四 部 分 内 容 :

1.初 始 化 部 分 (initialization):用 来 设 置 循 环 的 一 些 初 始 条 件 , 如 计 数 器 清 零 等 。

2.循 环 体 部 分 (body):这 是 反 复 循 环 的 一 段 代 码 ,可 以 是 单 一 的 一 条 语 句 ,也 可 以 是 复 合 语
句 。

3.迭 代 部 分 (iteration):这 是 在 当 前 循 环 结 束 ,下 一 次 循 环 开 始 前 执 行 的 语 句 ,常 常 用 来 使 计
数 器 加 1或 减 1。

4.终 止 部 分 (termination):通 常 是 一 个 布 尔 表 达 式 ,每 一 次 循 环 都 要 对 该 表 达 式 求 值 ,以 验 证
是 否 满 足 循 环 终 止 条 件 。

Java中 提 供 的 循 环 语 句 有 :while语 句 ,do-while语 句 和 for语 句 ,下 面 分 别 介 绍 。

4.2.1while语 句

while语 句 实 现 "当 型 "循 环 ,它 的 一 般 格 式 为 ;

[initialization]
while (termination){
body;
[iteration;]
}

1.当 布 尔 表 达 式 (termination)的 值 为 true时 ,循 环 执 行 大 括 号 中 的 语 句 。 并 且 初 始 化 部 分 和
迭 代 部 分 是 任 选 的 。

2.while语 句 首 先 计 算 终 止 条 件 ,当 条 件 满 足 时 ,才 去 执 行 循 环 体 中 的 语 句 。 这 是 "当 型 "循
环 的 特 点 。

4.2.2 do-while语 句

do-while 语句实现"直到型"循环,它的一般格式为:
[initialization]
do {
body;
[iteration;]
} while (termination);

1.do-while语 句 首 先 执 行 循 环 体 ,然 后 计 算 终 止 条 件 ,若 结 果 为 true,则 循 环 执 行 大 括 号 中 的
语 句 ,直 到 布 尔 表 达 式 的 结 果 为 false。

2.与 while语 句 不 同 的 是 ,do-while语 句 的 循 环 体 至 少 执 行 一 次 , 这 是 "直 到 型 "循 环 的 特 点 。

4.2.3 for语 句

for语 句 也 用 来 实 现 "当 型 "循 环 ,它 的 一 般 格 式 为 :

for (initialization; termination; iteration){

body;

}

1.for语 句 执 行 时 ,首 先 执 行 初 始 化 操 作 ,然 后 判 断 终 止 条 件 是 否 满 足 ,如 果 满 足 ,则 执 行 循
环 体 中 的 语 句 ,最 后 执 行 迭 代 部 分 。 完 成 一 次 循 环 后 ,重 新 判 断 终 止 条 件 。

2.可 以 在 for语 句 的 初 始 化 部 分 声 明 一 个 变 量 ,它 的 作 用 域 为 整 个 for 语 句 。

3.for语 句 通 常 用 来 执 行 循 环 次 数 确 定 的 情 况 (如 对 数 组 元 素 进 行 操 作 ),也 可 以 根 据 循 环
结 束 条 件 执 行 循 环 次 数 不 确 定 的 情 况 。

4.在 初 始 化 部 分 和 迭 代 部 分 可 以 使 用 逗 号 语 句 ,来 进 行 多 个 操 作 。 逗 号 语 句 是 用 逗 号
分 隔 的 语 句 序 列 。 例 如 :

for( i=0, j=10; i<j; i++, j--){
……
}

5.初 始 化 、 终 止 以 及 迭 代 部 分 都 可 以 为 空 语 句 (但 分 号 不 能 省 ),三 者 均 为 空 的 时 候 ,相
当 于 一 个 无 限 循 环 。

4.2.4 continue语 句

1.continue语 句 用 来 结 束 本 次 循 环 ,跳 过 循 环 体 中 下 面 尚 未 执 行 的 语 句 ,接 着 进 行 终 止 条
件 的 判 断 ,以 决 定 是 否 继 续 循 环 。 对 于 for语 句 ,在 进 行 终 止 条 件 的 判 断 前 ,还 要 先 执 行 迭 代
语 句 。 它 的 格 式 为 :

continue;

2.也 可 以 用 continue跳 转 到 括 号 指 明 的 外 层 循 环 中 ,这 时 的 格 式 为

continue outerLable;

例 如 :

outer: for( int i=0; i<10; i++ ){ ∥外层循环
for( int j=0; j<20; j++ ){ ∥内层循环
if( j>i ){
……
continue outer;
}
……
}
……
}

该 例 中 ,当 满 足 j>i的 条 件 时 ,程 序 执 行 完 相 应 的 语 句 后 跳 转 到 外 层 循 环 ,执 行 外 层 循 环
的 迭 代 语 句 i++;然 后 开 始 下 一 次 循 环 。

4.2.5举 例

例 4.4 下 例 分 别 用 while、 do-while和 for语 句 实 现 累 计 求 和 。

public class Sum{
public static void main( String args[] ){
System.out.println("/n** while statement **");
int n=10,sum=0; ∥initialization
while( n>0 ){ ∥termination
sum+=n; ∥body
n--; ∥iteration
}
System.out.println("sum is "+sum);
System.out.println("/n** do_while statement **");
n=0; ∥initialization
sum=0;
do{
sum+=n; ∥body
n++; ∥iteration
}while( n<=10 ); ∥termination
System.out.println("sum is "+sum);
System.out.println("/n** for statement **");
sum=0;
for( int i=1; i<=10; i++){
∥initialization,termination,iteration
sum+=i;
}
System.out.println("sum is "+sum);
}
}
运行结果为:
C:/>java Sum
** while statement **
sum is 55
** do_while statement **
sum is 55
** for statement **
sum is 55
可以从中来比较这三种循环语句,从而在不同的场合选择合适的语句。
例4.5 求100~200间的所有素数
public class PrimeNumber{
public static void main( String args[] ){
System.out.println(" ** prime numbers between 100 and 200 **");
int n=0;
outer:for(int i=101;i<200;i+=2){ ∥outer loop
int k=15; ∥select for convinence for(int j=2;j<=k;j++){ ∥inner loop
if( i%j==0 )
continue outer;
}
System.out.print(" "+i);
n++; ∥output a new line
if( n<10 ) ∥after 10 numbers
continue;
System.out.println();
n=0;
}
System.out.println();
}
}
运行结果为:
C:/>java PrimeNumber
** prime numbers between 100 and 200 **
101 103 107 109 113 127 131 137 139 149
151 157 163 167 173 179 181 191 193 197
199

该 例 通 过 一 个 嵌 套 的 for语 句 来 实 现 。 !U4§ 4.3例 外 处 理 语 句

例 外 处 理 语 句 包 括 try、 catch、 finally以 及 throw语 句 。 与 C、 C+ +相 比 ,例 外 处 理 语 句 是
Java所 特 有 的 。 我 们 将 在 第 八 章 作 专 门 的 介 绍 。 !U4§ 4.4 注 释 语 句

Java中 可 以 采 用 三 种 注 释 方 式 :

1 ∥ 用于单行注释。注释从∥开始,终止于行尾。
2 /* … */ 用于多行注释。注释从/*开始,到*/结束,且这种注释不能互相嵌套。
3 /** … */ 是Java所特有的doc注释。它以/**开始,到*/结束。这种注释主要是
为支持JDK工具javadoc而采用的。javadoc能识别注释中用标记@标识的一些特殊变量,并把
doc注释加入它所生成的HTML文件。对javadoc的详细讲述可参见附录。

 (未 完 待 续 )

四轴飞行diy全套入门教程(从最基础的开始)

首先声明本人也是菜鸟,此教程就是从一个菜鸟的角度来讲解,现在论坛上的帖子都突然冒很多名词出来,又不成体系,我自己开始学的时候往往一头雾水,相信很多新手也一样。所以在这个帖子里面,我都会把自己遇到的疑惑...
  • J_1234567890
  • J_1234567890
  • 2016年07月07日 15:15
  • 6959

Java入门 第一季第四章 流程控制语句

4-1 Java条件语句之 if 注意:if后面条件判断结果必须为  布尔型 语法: 执行过程: 4-2 Java条件语句之 if…else 语法: 执行过程: ...
  • smilewsw
  • smilewsw
  • 2016年04月11日 21:47
  • 2123

《C++入门经典(第4版)》之C++编程总结

C++要比许多人想象的更容易理解。如果你非常渴望学习,并具备逻辑思考的能力,掌握C++就会比想象的更容易。开发C++技巧,学习数百万人已在使用的语言,掌握C++技能,它提供了在几乎任何环境下开发应用程...
  • qinghuawenkang
  • qinghuawenkang
  • 2015年09月08日 10:34
  • 3008

Java API——RMIIO入门教程(2)远程流传输示例之RMIIO服务源码

1. RMI Service Interface package com.sinosuperman.rmiio2; import java.rmi.Remote; import jav...
  • Poechant
  • Poechant
  • 2011年12月01日 17:16
  • 2319

Java入门教程之图书管理系统(由简入繁)(四)

上一篇博客我们提到代码太臃肿,那么这篇博客将来解决这个问题。这篇博客将把上篇博客的代码改成MVC编程模式,MVC即models,views,controller,详细介绍请继续往下看。...
  • AlexTan_
  • AlexTan_
  • 2017年03月23日 22:41
  • 2074

java入门教程-8.2Java中面向字符的输入流

字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件。 Reader和Writer是java.io包中所有字符流的父类。由于它们都是抽象类,所以应使用...
  • softn
  • softn
  • 2016年05月27日 09:32
  • 123

java入门教程-8.4Java中面向字节的输入输出流

字节流以字节为传输单位,用来读写8位的数据,除了能够处理纯文本文件之外,还能用来处理二进制文件的数据。 InputStream类和OutputStream类是所有字节流的父类。 InputStr...
  • softn
  • softn
  • 2016年05月27日 09:34
  • 139

Android Studio NDK 入门教程(3)--Java与C++之间的类型签名

概述本文主要介绍Java与C++通信时函数的签名关系
  • venusic
  • venusic
  • 2016年08月19日 16:41
  • 1408

Android Studio NDK 入门教程(5)--Java对象的传递与修改

概述本文主要Java与C++之间的对象传递与取值。包括传递Java对象、返回Java对象、修改Java对象、以及性能对比。...
  • venusic
  • venusic
  • 2016年08月24日 17:34
  • 2257

Java入门教程之图书管理系统(由简入繁)(六)

这次的代码主要是对上次的一些改进,具体修改了一些不可描述的BUG,和新增了几个查询方式,还把以前的Book类加了进来(这对以后返回给前端有用),废话不多说,直接贴代码!(注意:数据库的表的创建在:Ja...
  • AlexTan_
  • AlexTan_
  • 2017年03月30日 16:56
  • 3671
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA入门教程: 第 四 章 流 控 制
举报原因:
原因补充:

(最多只允许输入30个字)