语言基础
3.4 控制流程语句
程序使用控制流程语句来有条件地执行语句、循环语句或者跳转到程序中的其它部分执行语句。这节教程介绍怎样利用比如if-else和while来控制你的程序流程。
当你编写程序的时候,你在文件中键如语句。如果你没有使用控制流程语句,编译器将以从左到右、从上到下的顺序执行这些语句。你可以在你的程序中使用控制流程语句来有条件地执行语句、来重复执行语句块地代码、改变程序执行的顺序等等。比如,在下面的代码段中,if语句就有条件执行了括号中的System.out.println,这里的条件是Character.isUpperCase(aChar)的返回值:
char c;
...
if (Character.isUpperCase(aChar)) {
System.out.println("The character " + aChar + " is upper case.");
}
JAVA编程语言提供了几个控制流程语句,在下表给出了:
3.4 控制流程语句
控制流程语句的基本格式为:
控制流程语句描述
{
语句(参数)
}
如果块中只有一条语句,大括号{和}并不是必要的。但是这里推荐使用{和},因为代码会更容易阅读,避免在修改代码的时候发生错误。
控制流程语句有:
while和do-while语句
for语句
if-else语句
switch语句
异常处理语句
分支语句
这里注意,虽然goto是一个保留字,它在C语言中也是一个控制流程语句,但是当前JAVA编程语言还不支持这个goto语句。
好吧,我们开始对各个控制流程语句逐个介绍。
3.4.1 while和do-while语句
你可以使用while语句当条件保持为true的时候,持续执行语句块。While语句的通常语法为:
while (expression) {
statement
}
首先,while语句执行表达式,它将返回一个boolean数(true或者false)。如果表达式返回true,while语句执行相应的语句。While语句继续测试表达式并执行块代码直到表达式返回false。
下面给出一个例程WhileDemo,它使用while语句来浏览字符串的各个字符并复制字符串直到程序找到字符g为止:
public class WhileDemo {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you " +
"encounter the letter 'g'.";
StringBuffer copyToMe = new StringBuffer();
int i = 0;
char c = copyFromMe.charAt(i);
while (c != 'g') {
copyToMe.append(c);
c = copyFromMe.charAt(++i);
}
System.out.println(copyToMe);
}
}
最后一行打印出来的数值为:Copy this strin.
3.4.1 while和do-while语句
JAVA编程语言提供了另外一个语句,它跟while语句和相似,即do-while语句。Do-while的语法为:
do {
statement(s)
} while (expression);
不象while语句,do-while语句是先执行循环中的语句后再计算表达式的,所以do-while语句就至少执行一次语句。
下面是对上面的程序利用do-while来修改而得的:
public class DoWhileDemo {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you " +
"encounter the letter 'g'.";
StringBuffer copyToMe = new StringBuffer();
int i = 0;
char c = copyFromMe.charAt(i);
do {
copyToMe.append(c);
c = copyFromMe.charAt(++i);
} while (c != 'g');
System.out.println(copyToMe);
}
}
最后一行打印出来的数值为:Copy this strin
3.4.2 for语句
for语句提供了一个简便的方法来进行循环。For语句的语法如下:
for (初始条件;终止条件;增量) {
语句
}
初始条件是初始化循环的表达式,它在循环开始的时候就被执行一次。而终止条件决定什么时候终止循环。这个表达式在每次循环的过程都被计算。当表达式计算结果为false的时候,这个循环结束。最后,增量是循环一次增加多少(即步长)的表达式。所有的这些都是可选的。实际上,为了实现无限制的循环,这三个表达式都可以省略。
for ( ; ; ) { // 无限制的循环
...
}
下面是一个例程ForDemo,它使用了一个for语句来打印一个数组的所有元素:
public class ForDemo {
public static void main(String[] args) {
int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076,
2000, 8, 622, 127 };
for (int i = 0; i < arrayOfInts.length; i++) {
System.out.print(arrayOfInts[i] + " ");
}
System.out.println();
}
}
这个程序的输出为: 32 87 3 589 12 1076 2000 8 622 127.
这里注意你可以在for循环的初始化语句中声明一个本地变量。这个变量的作用域只是在for语句的块中,它可以用在终止条件语句和增量表达式中。如果控制for循环的变量没有用在循环的外部,最好的方法是在初始化表达式中声明这个变量。例如i、j、k等经常用来在for控制语句中,在for循环的初始化表达式中声明它们来限制它们的生命周期以减少错误
3.4.3 if-else语句
if语句可以使程序根据一些条件有选择地执行语句。举个例子,假如你的程序根据boolean变量DEBUG的值来打印了调试信息。如果DEBUG是true,你的程序就打印出调试信息,比如变量x的数值;或者就不打印。具体的程序如下:
if (DEBUG) {
System.out.println("DEBUG: x = " + x);
}
上面是一个简单的if语句的例子。总得说来,if语句的语法格式为:
if (表达式) {
语句(参数)
}
如果你想在if判断表达式为false的时候执行不同的语句,你可以使用else语句。举个另外的例子吧,假如你的程序需要执行不同的工作,主要是根据用户是点击OK键还是击警告窗口中的其它按钮。你可以使用if和else语句来实现这个目的:
. . .
// response is either OK or CANCEL depending
// on the button that the user pressed
. . .
if (response == OK) {
// 在这里添加执行OK动作的代码
} else {
// 在这里添加执行Cancel动作的代码
3.4.3 if-else语句
如果if部分为false,则执行else块。另外一种else语句的格式是else if,它根据执行另外的表达式执行语句。一个if语句可以跟着任意个else if语句,但只能有一个else语句。下面是一个例程IfElseDemo,它根据测试分数的数值来指定一个等级:90%或者更高为A,80%或者更高为B等等。
public class IfElseDemo {
public static void main(String[] args) {
int testscore = 76;
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 = C
这时你可以注意到testscore的数值可以满足组合if条件76 >= 70 and 76 >= 60,但是当系统处理组合if语句的时候,一旦条件满足,适当的语句就将被执行(grade = 'C';),并且不需要计算剩余的条件控制就跳出if语句。JAVA编程语言支持运算符?:,它是一个简化的if语句。 下面再看看上面教程中的MaxVariablesDemo程序:
if (Character.isUpperCase(aChar)) {
System.out.println("The character " + aChar + " is upper case.");
} else {
System.out.println("The character " + aChar + " is lower case.");
}
下面你可以利用?:运算符来重写这段代码:
System.out.println("The character " + aChar + " is " +
(Character.isUpperCase(aChar) ? "upper" : "lower") +
"case.");
如果这个isUpperCase方法返回true,这个?:运算符返回字符串"upper" 。或则,它就返回字符串"lower"
3.4.4 switch语句
使用switch语句可以根据一个整型表达式有条件地执行语句。下面的例程SwitchDemo,声明了一个整型变量month,它的数值代表了月份。这个程序显示了月份的名字,主要是根据month的数值并且使用了switch语句。
public class SwitchDemo {
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的数值,然后计算适当的