控制语句用于改变程序执行的顺序。程序利用控制语句有条件地执行语句,循环地执行语句或者跳转到程序中的其他部分执行语句。下面介绍怎样利用if…else和while语句来控制程序的流程。
当编写程序的时候,如果没有使用控制语句,计算机将顺序执行所有的语句;如果要改变程序的流程,可以在程序中使用控制语句来有条件地选择执行语句或重复执行某个语句块。
Java的控制语句有以下几种:
· if语句。
· switch语句。
· while和do…while语句。
· for语句。
· 跳转语句。
· 异常处理语句。
表2-12给出了Java语言提供的控制语句的分类和关键字。
表2-12 Java的控制语句的分类和关键字
语 句 |
关 键 字 |
语 句 |
关 键 字 |
判断语句 |
If…else, switch…case |
跳转语句 |
break, continue, label, return |
循环语句 |
while, do…while , for |
异常处理 |
Try…catch…finally, throw |
控制语句的基本语法格式为:
控制语句(参数){
程序块
}
如果程序块中只有一条语句,则可省略花括号“{ }”,但还是推荐使用“{ }”,这样代码更易阅读,也可避免在修改代码时发生错误。
用“{ }”包括起来的语句称为语句块,“{ }”中可以有若干条语句,也可以没有语句。语句块能够出现在任何允许语句出现的地方。例如:
if (Character.isUpperCase(aChar)) {
System.out.println("The character " + aChar + " is upper case.");
} else {
System.out.println("The character " + aChar + " is lower case.");
}
if语句可以使程序根据条件有选择地执行语句。例如,在程序中根据布尔型变量DEBUG的值来打印调试信息。当DEBUG值是true时,程序就打印出调试信息,否则就不打印。这段程序可用if语句表达为:
if (DEBUG) {
System.out.println("DEBUG: x = " + x);
}
if语句有两种语法格式。第一种if语句的语法格式如下。
if (表达式) {
语句块
}
如果想在if判断表达式为false的时候执行不同的语句,则可以使用另一种if语句,即else语句。第二种if语句的语法格式如下。
if (表达式) {
语句块1
} else {
语句块2
}
这种类型的if语句,如果if判断表达式为false,则程序执行else语句。else语句的另外一种格式是else if。一个if语句可以有任意多个else if,但只能有一个else。
【例2-4】编写一个程序:根据分数来指定等级。大于等于90分,等级为A;小于90分但大于等于80分,等级为B,依此类推。
public class IfElseExample {
public static void main(String[] args) {
int testscore = 88;
char grade;
if (testscore >= 90) {
grade = 'A';
} else if (testscore >= 80) {
grade = 'B';
} else if (testscore >= 70) {
grade = 'C';
} else if (testscore >= 60) {
grade = 'D';
} else {
grade = 'F';
}
System.out.println("Grade = " + grade);
}
}
程序的输出如下:
Grade = B
switch语句是一个多路选择语句,也称为开关语句。它可以根据一个整型表达式有条件地选择一个语句执行。
【例2-5】该程序声明了一个整型变量month,它的数值代表了月份,根据month的值显示月份的名字。
public class SwitchExample {
public static void main(String[] args) {
int month = 8;
switch (month) {
case 1: System.out.println("January"); break;
case 2: System.out.println("February"); break;
case 3: System.out.println("March"); break;
case 4: System.out.println("April"); break;
case 5: System.out.println("May"); break;
case 6: System.out.println("June"); break;
case 7: System.out.println("July"); break;
case 8: System.out.println("August"); break;
case 9: System.out.println("September"); break;
case 10: System.out.println("October"); break;
case 11: System.out.println("November"); break;
case 12: System.out.println("December"); break;
}
}
}
这个switch语句计算它的参数表达式month的值,然后选择适当的case 语句。这样,程序的输出如下。
August
本例也可使用if语句来实现:
int month = 8;
if (month == 1) {
System.out.println("January");
} else if (month == 2) {
System.out.println("February");
}
…
选择使用if语句还是switch语句,主要是根据可读性以及其他因素来决定的。选择if语句可以根据多种条件表达式来决定,而选择switch语句只有根据单个整型变量来决定。另外必须注意的一点是,switch语句在每个case之后都有一个break语句。每个break语句都终止swtich语句,并且控制流程继续执行switch块之后的第一个语句。break语句是必须的,若没有break语句,则控制流程按顺序逐一地执行case语句,这就起不到控制的作用。
Java语言提供了两种while语句,即while语句和do…while语句。
(1)while语句。
当条件保持为true的时候,while语句重复执行语句块。while语句的基本语法为:
while (表达式) {
循环体
}
首先,while语句计算括号中的表达式,它将返回一个布尔值(true或false)。如果表达式返回true,则执行花括号中的语句。然后while语句继续测试表达式来确定是否执行循环体,直到该表达式返回false。
【例2-6】编写一个程序,使用while语句来浏览字符串的各个字符,并复制字符串直到程序找到字符u为止。
public class WhileExample {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you encounter the
letter 'u'.";
StringBuffer copyToMe = new StringBuffer(); //创建一个空的串变量
int i = 0;
char c = copyFromMe.charAt(i); //该串变量的第一个字符赋给c
while (c != 'u') {
copyToMe.append(c);
c = copyFromMe.charAt(++i);
}
System.out.println(copyToMe);
}
}
最后一行打印出来的字符串如下。
Copy this string
(2)do…while语句。
Do…while语句的语法为:
do{
循环体
} while (表达式);
与while语句不同的是,do…while语句先执行循环体中的语句,再计算表达式,所以do…while语句至少执行一次循环体。
【例2-7】对例2-6中的程序利用do…while循环来代替while循环。
public class DoWhileExample {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you encounter
the letter 'u'.";
StringBuffer copyToMe = new StringBuffer();
int i = 0;
char c = copyFromMe.charAt(i);
do {
copyToMe.append(c);
c = copyFromMe.charAt(++i);
} while (c != 'u');
System.out.println(copyToMe);
}
}
最后一行打印出来的字符串仍然为:
Copy this string
for语句提供了一个更简便、更灵活的方法来进行循环。for语句的语法如下:
for (初始条件; 终止条件; 增量) {
循环体
}
在for语句中,各语法成分如下:
· 初始条件是初始化循环的表达式,它在循环开始的时候就被执行一次。
· 终止条件决定什么时候终止循环。这个表达式在每次循环的过程中都被计算一次。当表达式计算结果为false的时候,循环结束。
· 增量是指定循环一次增加多少(即步长)的表达式。
· 循环体是被重复执行的语句块。
实际上,所有这些语法成分都是可选的。若前3个表达式都省略,则为无限循环:
for ( ; ; ) {
…… //循环体
}
所以,为避免无限循环,上述语句的循环体中应包含能够退出循环的语句。
Java语言有以下3种跳转语句。
· break语句。
· continue语句。
· return语句。
下面逐一介绍这几个语句。
break语句有两种形式:无标号语句和带标号语句。
(1)无标号的break语句。
其功能是从该语句所在的switch分支或循环中跳转出来,执行后继语句。
在例2-5的SwitchExample程序中已经用过无标号的break语句。一旦无标号的break语句终止swtich语句,控制流程马上转到switch语句的后继语句。
【例2-8】本例程序中包含了一个for循环,以查找数组中特定的数值。
public class BreakExample {
public static void main(String[] args) {
int[] arrayOfInts = {32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 };
int searchfor = 12;
int i = 0;
boolean foundIt = false;
for ( i = 0; i < arrayOfInts.length; i++) {
if (arrayOfInts[i] == searchfor) {
foundIt = true;
break;
}
}
if (foundIt) {
System.out.println("Found " + searchfor + " at index " + i);
} else {
System.out.println(searchfor + "not in the array");
}
}
}
当找到需要的数值的时候,break语句终止了它所在的for循环,控制流程转到for语句的后一个语句继续执行。本程序的输出如下:
Found 12 at index 4
(2)带标号的break语句。
其语法格式为:
break 标号名;
break后的标号名还应标识在某个语句块之前。这个语句的功能是终止并跳出这个标号所标识的语句块,并执行该语句块的后继语句。
continue语句用于跳过当前的for、while或do…while循环的剩余部分。continue语句也有两种形式:无标号语句和有标号语句。
(1)无标号的continue语句。
其功能是终止当前这一轮循环,即跳过continue语句后面剩余的语句,并计算和判断循环条件,决定是否进入下一轮循环。
【例2-9】遍历字符串中的所有字符。如果当前字符不是p,continue语句就忽略循环的剩余部分并且处理下一个字符;反之,对计数器增1,再将p转换为大写字母。
public class ContinueExample {
public static void main(String[] args) {
StringBuffer searchMe = new StringBuffer(
"peter piper picked a peck of pickled peppers");
int max = searchMe.length();
int numPs = 0;
for (int i = 0; i < max; i++) {
if (searchMe.charAt(i) != 'p') //找出字符p
continue;
numPs++; //累加p的数目
searchMe.setCharAt(i, 'P');
}
System.out.println("Found " + numPs + " p's in the string.");
System.out.println(searchMe);
}
}
程序的输出如下:
Found 9 p's in the string.
Peter PiPer Picked a Peck of Pickled PePPers
(2)带标号的continue语句。
其语法格式为:
continue 标号名;
continue后的标号名还应标识在某外层循环语句前。其作用是使程序的控制流程转入标号所标识的循环层次,继续执行。
【例2-10】本例用一个嵌套的循环来搜索一个子字符串。
public class ContinueWithLabelExample {
public static void main(String[] args) {
String searchMe = "Look for a substring in me";
String substring = "sub";
boolean foundIt = false;
int max = searchMe.length() - substring.length();
test:
for (int i = 0; i <= max; i++) {
int n = substring.length();
int j = i;
int k = 0;
while (n-- != 0) {
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test; // 跳到test所标识的for循环,
// 进入i的下一轮循环
}
}
foundIt = true;
break test;
}
System.out.println(foundIt ? "Found it" : "Didn't find it");
}
}
程序的输出为如下:
Found it
return语句的一般形式为:
return 表达式;
return语句的功能是:退出当前的方法(函数),使控制流程返回到调用该方法的语句之后的下一个语句。例如:
return ++count;
由return返回的值的类型必须与方法的返回类型相匹配。return语句有两种返回形式:一种是有返回值,另外一种是无返回值。当一个方法被声明为void时,return语句就没有返回值。