Java程序流程控制
程序流控制语句可以使程序运行时,有条件地执行或重复重复执行某些语句,改变程序正规的顺序流向。Java提供了如下4类程序流控制语句
- 循环语句:包括while语句,do while语句和for语句
- 分支语句:包括if语句和switch语句
- 跳转语句:包括break语句,continue语句,label语句,return语句
- 异常处理语句:包括try catch finally语句和throw语句
1. while语句和do while语句
-
while语句
while语句使一个语句块在某中条件为真时循环执行,该语句的语法如下
while(逻辑表达式){ //语句或语句块 }
while语句中的表达式必须是逻辑型的。在该语句执行时,首先求表达式的值,如果得到的值为true,则执行while语句块中的语句。while语句将一直测试表达式的值并执行语句块,直到表达式的值变为false时为止。
用while语句复制字符串 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); //charAt(i)方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。 while(c != 'g'){ copyToMe.append(c); //append(c) 往动态字符串中添加字符 c = copyFrom.charAt(++i); } System.out.println(copyToMe); } }
-
do while语句
do while语句的语法如下:
do{ //语句或语句块 }while(逻辑表达式)
do while语句在执行时,首先执行循环体中的语句,然后再求表达式的值。do while语句将一直执行语句块并测试表达式的值,直到表达式的值变为false。do while语句实在循环体的底部求得表达式的值。因此do while语句至少要把循环体中的语句执行一遍。
//用do while语句复制字符串 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); //charAt(i)方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。 do{ copyToMe.append(c); //append(c) 往动态字符串中添加字符 c = copyFrom.charAt(++i); }while(c != 'g'); System.out.println(copyToMe); } }
2.for语句
for循环执行的次数时可以在执行前确定的。for语句的语法格式是:
for(初始语句;逻辑表达式;迭代语句){
//语句或语句块
}
for语句执行时先执行初始语句,判断逻辑表达式的值,当逻辑表达式为true时,执行循环体语句,接着执迭代语句,然后再去判别逻辑表达式的值。这个过程一直进行下去,直到逻辑表达式的值为false,循环结束并转到for之后的语句。关于for语句有以下几点说明
-
(1)可以在for循环的初始化部分声明一个变量,它的作用域为整个for循环
-
(2)for循环通常用于循环次数确定的情况,但也可以根据循环结束条件完成循环次数不确定的情况
-
(3)在初始化部分和迭代部分可以使用逗号语句来进行多个操作。逗号语句是用逗号分隔的语句序列。例:
for(i = 0,j = 10;i < j;i++,j--){ ... }
-
(4)初始化终止以及迭代部分都可以为空语句(但分号不能省略),逻辑表达式为空时,默认表达式恒为真,可以用下列for语句表示无限循环
for(;;;){ ... }
for循环经常用于数组各个元素或一个字符串中各个字符的处理。
//用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(); } }
3. if else语句
if语句是程序能够基于某种条件有选择地执行某些语句
if语句的语法格式是:
if(逻辑表达式){
语句/语句块1;
}else{
语句/语句块2;
}
if语句的含义是:当逻辑表达式的值为true时,执行语句1,然后继续执行if后面的语句。当逻辑表达式为false时,如果有else子句,则执行语句块2,否则跳过该if语句,继续执行后面的语句。语句1和语句2可以是单语句,也可以是语句块。
注意:
-
if关键字之后的逻辑表达式必须得到一个逻辑值,不能像其他语言那样以数值来代替。因为Java不提供数值与逻辑值之间的转换。例如,C语言中的语句形式:
int x = 3; if(x){...}
在Java中应该写为:
int x = 3; if(x !=0){...}
-
else语句的另外一种形式时else if语句。可以利用else if 语句构造嵌套的if语句。一个if语句可以有多个else if语句,但只能有一个else语句。
//利用if else语句输出成绩等级
public class IfElseDemo{
public static void main(String[] args){
int testscore = 76;
char grade;
if(testscore >=90){
grade = 'A';
}else if(teatscore >= 80){
grade = 'B';
}else if(testscore >= 70){
grade = 'C';
}else if(testscore >= 60){
grade = 'D';
}else{
grade = 'F';
}
System.out.print("Grade" + grade);
}
}
条件运算符“?:”是if else语句的一种紧缩格式的表示。某些情况下使用条件表达式会使程序更简洁易读。
if(Character.isUpperCase(aChar)){
System.out.println("The character " + aCher + "is upper case.");
}else{
System.out.println("The character " + aCher + "is lower case.");
}
等价于(用条件运算符)
System.out.println("The character " + aCher + "is " + (Charater.isupperrCase(aCher) ? "upper" : "lower") + "case.");
4. switch语句
switch语句是基于一个表达式的值决定要执行一组语句。switch语句的语法格式:
switch(表达式){
case c1:
语句组1;
break;
case c2:
语句组2;
break;
case c3:
语句组3;
break;
...
case ck:
语句组k;
break;
[default:
语句组;
break;]
}
switch语句的语义是:计算表达式的值,用该值依次和c1,c2,c3,…,ck想比较。如果该值等于其中之一,例如ci,那么执行case ci之后的语句组i,直到遇到break语句跳到switch之后的语句。如果没有相匹配的ci则执行default之后的语句。
说明
- switch中的表达式的值,可以是整型,枚举类型或String类的对象。整型表达式须是int兼容的类型,既可以是byte,short,char,int,不允许使用浮点型(float,double)或long型,并且各case子句中c1,c2,…,ck是int型或字符型常量。
- switch语句中各case分支既可以是单条语句,也可以是由多条语句组成的语句组,该语句组可以不用{}括起来
- default子句是可选的,并且最后一个break语句可以省略
- 不论执行那个case分支,程序流都会顺序执行下去,直到遇到break语句为止。可以利用这个特点简化程序的编写。
- switch结构的功能可以用if ,else if结构来实现,但在某些情况下,使用switch结构更简单,可读性强,而且程序的执行效率也得到了提高。但switch结构在数据类型受到了限制,如果要比较的数据类型是double型,则不能用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;
default: System.out.println("Hey, that's not a valid month!");break;
}
}
}
5. 循环跳转语句
Java中可以利用break和continue两个循环跳转语句进一步控制循环。这两个语句的一般格式为:
break [label]; //用来从switch语句或循环语句跳出
continue [label]; //跳出循环体的剩余语句,开始执行下一次循环
//这两个都可以带标签或者不带标签.
//带标签:
label: statement;
-
break 语句
-
不带标签的
结束了switch语句的执行,并把控制流转移到紧跟在switch之后的语句。还可以使用不带标签的break语句终止循环,包括for,while和do while。不带标签的break语句用来结束最内层的switch,for,while和do while语句的执行。//在数组中寻找指定的值 public class BreakDemo{ 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 < arrayOfInts.length;i++){ if(arrayOfInts[i] == searchfor){ foundId = true; break } } if(foundIt){ System.out.println("Found" + searchfor + "at index" + i); }else{ System.out.println(searchfor + "not in the array"); } } }
-
带标签的
带标签的break语句将结束标签所指示的循环的执行。//在二维数组中搜索指定的值 public class BreakWithLabelDemo{ public static void main(String[] args){ int[][] arrayOfInts = {{32,87,3,589}, {12,1076,2000,8}, {622,127,77,955} }; int searchfor = 12; int i = 0; int j = 0; boolean foundIt = false; search: for(; i < arrayOfInts.length;i++){ for(j = 0; j < arrayOfints[i];j++){ if(arrayOfInts[i][j] == searchfor){ foundIt = search; } } } if(foundIt){ System.out.println("Found" + searchfor + "at" + i + "," +j); }else{ System.out.println(searchfor + "not in the array"); } } }
-
-
continue 语句
-
不带标签:在for,while和 do while循环中,continue语句跳过当前循环的其余语句,执行下一次循环,当然执行下一次循环前要判定循环条件是否满足。不带标签的continue语句跳过最内层的循环,并开始执行最内层循环的下一次循环。
//在字符串缓冲区中寻找指定字符并进行处理 public class ContinueDemo{ 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') continue; //对字母p进行处理 numPs++; searchMe.setCharAt(i,'p'); } System.out.println("Fount" + numPs + "p's in the string."); System.out.println(searchMe); } }
-
带标签:带标签的continue语句结束由标签所指外层循环的当前循环,开始执行该循环的下次循环;
public class COntinueWithLabelDome{ 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; } } foundIt = true; break test; } System.out.println(foundIt ? "Found it" : "Didn't find it"); } }
-