34控制流程语句.docx
- 文档编号:26128274
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:16
- 大小:20.90KB
34控制流程语句.docx
《34控制流程语句.docx》由会员分享,可在线阅读,更多相关《34控制流程语句.docx(16页珍藏版)》请在冰豆网上搜索。
34控制流程语句
语言基础
3.4控制流程语句
程序使用控制流程语句来有条件地执行语句、循环语句或者跳转到程序中的其它部分执行语句。
这节教程介绍怎样利用比如if-else和while来控制你的程序流程。
当你编写程序的时候,你在文件中键如语句。
如果你没有使用控制流程语句,编译器将以从左到右、从上到下的顺序执行这些语句。
你可以在你的程序中使用控制流程语句来有条件地执行语句、来重复执行语句块地代码、改变程序执行的顺序等等。
比如,在下面的代码段中,if语句就有条件执行了括号中的System.out.println,这里的条件是Character.isUpperCase(aChar)的返回值:
charc;
...
if(Character.isUpperCase(aChar)){
System.out.println("Thecharacter"+aChar+"isuppercase.");
}
JAVA编程语言提供了几个控制流程语句,在下表给出了:
语句
关键字
循环语句
while,do-while,for
判断语句
if-else,switch-case
异常处理
try-catch-finally,throw
分支语句
break,continue,label:
return
控制流程语句的基本格式为:
控制流程语句描述
{
语句(参数)
}
如果块中只有一条语句,大括号{和}并不是必要的。
但是这里推荐使用{和},因为代码会更容易阅读,避免在修改代码的时候发生错误。
控制流程语句有:
1.while和do-while语句
2.for语句
3.if-else语句
4.switch语句
5.异常处理语句
6.分支语句
这里注意,虽然goto是一个保留字,它在C语言中也是一个控制流程语句,但是当前JAVA编程语言还不支持这个goto语句。
好吧,我们开始对各个控制流程语句逐个介绍。
3.4.1while和do-while语句
你可以使用while语句当条件保持为true的时候,持续执行语句块。
While语句的通常语法为:
while(expression){
statement
}
首先,while语句执行表达式,它将返回一个boolean数(true或者false)。
如果表达式返回true,while语句执行相应的语句。
While语句继续测试表达式并执行块代码直到表达式返回false。
下面给出一个例程WhileDemo,它使用while语句来浏览字符串的各个字符并复制字符串直到程序找到字符g为止:
publicclassWhileDemo{
publicstaticvoidmain(String[]args){
StringcopyFromMe="Copythisstringuntilyou"+
"encountertheletter'g'.";
StringBuffercopyToMe=newStringBuffer();
inti=0;
charc=copyFromMe.charAt(i);
while(c!
='g'){
copyToMe.append(c);
c=copyFromMe.charAt(++i);
}
System.out.println(copyToMe);
}
}
最后一行打印出来的数值为:
Copythisstrin.
JAVA编程语言提供了另外一个语句,它跟while语句和相似,即do-while语句。
Do-while的语法为:
do{
statement(s)
}while(expression);
不象while语句,do-while语句是先执行循环中的语句后再计算表达式的,所以do-while语句就至少执行一次语句。
下面是对上面的程序利用do-while来修改而得的:
publicclassDoWhileDemo{
publicstaticvoidmain(String[]args){
StringcopyFromMe="Copythisstringuntilyou"+
"encountertheletter'g'.";
StringBuffercopyToMe=newStringBuffer();
inti=0;
charc=copyFromMe.charAt(i);
do{
copyToMe.append(c);
c=copyFromMe.charAt(++i);
}while(c!
='g');
System.out.println(copyToMe);
}
}
最后一行打印出来的数值为:
Copythisstrin
3.4.2for语句
for语句提供了一个简便的方法来进行循环。
For语句的语法如下:
for(初始条件;终止条件;增量){
语句
}
初始条件是初始化循环的表达式,它在循环开始的时候就被执行一次。
而终止条件决定什么时候终止循环。
这个表达式在每次循环的过程都被计算。
当表达式计算结果为false的时候,这个循环结束。
最后,增量是循环一次增加多少(即步长)的表达式。
所有的这些都是可选的。
实际上,为了实现无限制的循环,这三个表达式都可以省略。
for(;;){//无限制的循环
...
}
下面是一个例程ForDemo,它使用了一个for语句来打印一个数组的所有元素:
publicclassForDemo{
publicstaticvoidmain(String[]args){
int[]arrayOfInts={32,87,3,589,12,1076,
2000,8,622,127};
for(inti=0;i System.out.print(arrayOfInts[i]+""); } System.out.println(); } } 这个程序的输出为: 3287358912107620008622127. 这里注意你可以在for循环的初始化语句中声明一个本地变量。 这个变量的作用域只是在for语句的块中,它可以用在终止条件语句和增量表达式中。 如果控制for循环的变量没有用在循环的外部,最好的方法是在初始化表达式中声明这个变量。 例如i、j、k等经常用来在for控制语句中,在for循环的初始化表达式中声明它们来限制它们的生命周期以减少错误 3.4.3if-else语句 if语句可以使程序根据一些条件有选择地执行语句。 举个例子,假如你的程序根据boolean变量DEBUG的值来打印了调试信息。 如果DEBUG是true,你的程序就打印出调试信息,比如变量x的数值;或者就不打印。 具体的程序如下: if(DEBUG){ System.out.println("DEBUG: x="+x); } 上面是一个简单的if语句的例子。 总得说来,if语句的语法格式为: if(表达式){ 语句(参数) } 如果你想在if判断表达式为false的时候执行不同的语句,你可以使用else语句。 举个另外的例子吧,假如你的程序需要执行不同的工作,主要是根据用户是点击OK键还是击警告窗口中的其它按钮。 你可以使用if和else语句来实现这个目的: ... //responseiseitherOKorCANCELdepending //onthebuttonthattheuserpressed ... if(response==OK){ //在这里添加执行OK动作的代码 }else{ //在这里添加执行Cancel动作的代码 3.4.3if-else语句 如果if部分为false,则执行else块。 另外一种else语句的格式是elseif,它根据执行另外的表达式执行语句。 一个if语句可以跟着任意个elseif语句,但只能有一个else语句。 下面是一个例程IfElseDemo,它根据测试分数的数值来指定一个等级: 90%或者更高为A,80%或者更高为B等等。 publicclassIfElseDemo{ publicstaticvoidmain(String[]args){ inttestscore=76; chargrade; if(testscore>=90){ grade='A'; }elseif(testscore>=80){ grade='B'; }elseif(testscore>=70){ grade='C'; }elseif(testscore>=60){ grade='D'; }else{ grade='F'; } System.out.println("Grade="+grade); } } 程序的输出为: Grade=C 3.4.3if-else语句 这时你可以注意到testscore的数值可以满足组合if条件76>=70and76>=60,但是当系统处理组合if语句的时候,一旦条件满足,适当的语句就将被执行(grade='C';),并且不需要计算剩余的条件控制就跳出if语句。 JAVA编程语言支持运算符? : ,它是一个简化的if语句。 下面再看看上面教程中的MaxVariablesDemo程序: if(Character.isUpperCase(aChar)){ System.out.println("Thecharacter"+aChar+"isuppercase."); }else{ System.out.println("Thecharacter"+aChar+"islowercase."); } 下面你可以利用? : 运算符来重写这段代码: System.out.println("Thecharacter"+aChar+"is"+ (Character.isUpperCase(aChar)? "upper": "lower")+ "case."); 如果这个isUpperCase方法返回true,这个? : 运算符返回字符串"upper"。 或则,它就返回字符串"lower" 3.4.4switch语句 使用switch语句可以根据一个整型表达式有条件地执行语句。 下面的例程SwitchDemo,声明了一个整型变量month,它的数值代表了月份。 这个程序显示了月份的名字,主要是根据month的数值并且使用了switch语句。 publicclassSwitchDemo{ publicstaticvoidmain(String[]args){ intmonth=8; switch(month){ case1: System.out.println("January");break; case2: System.out.println("February");break; case3: System.out.println("March");break; case4: System.out.println("April");break; case5: System.out.println("May");break; case6: System.out.println("June");break; case7: System.out.println("July");break; case8: System.out.println("August");break; case9: System.out.println("September");break; case10: System.out.println("October");break; case11: System.out.println("November");break; case12: System.out.println("December");break; } } } 这个switch语句计算它的表达式,在这个例子中是计算month的数值,然后计算适当的case语句。 这样,程序的输出为: August。 3.4.4switch语句 当然,你可以使用if语句来实现它: intmonth=8; if(month==1){ System.out.println("January"); }elseif(month==2){ System.out.println("February"); } ... 决定使用if语句还是switch语句的关键主要是根据可读型以及其它因素。 if语句可以在更大范围或者条件来决定,而switch只有根据单个整型变量来做决定。 同时,提供给case语句的数值必须是单一的。 另外一点是,switch语句在每个case之后有一个break语句。 每个break语句终止了swtich语句,并且控制流程继续switch块之后的第一个语句。 break语句是必须的,因为没有它,case语句就会失效,也就是说,没有break语句,控制流程按顺序执行case语句。 下面的程序SwichDemo2将介绍为什么它是有效的; 这个程序的输出为: NumberofDays=29 最后的break语句是不需要的,因为流程将跳出switch语句了。 但是,我们推荐使用为最后一个case语句使用一个break以防你需要还增加更多的case语句。 这就使得更容易修改代码以及减少错误。 一般地,你可以使用break来在分支语句中终止循环。 最后你可以在switch最后使用缺省地语句来处理所有的上面没有处理的情况。 intmonth=8; ... switch(month){ case1: System.out.println("January");break; case2: System.out.println("February");break; case3: System.out.println("March");break; case4: System.out.println("April");break; case5: System.out.println("May");break; case6: System.out.println("June");break; case7: System.out.println("July");break; case8: System.out.println("August");break; case9: System.out.println("September");break; case10: System.out.println("October");break; case11: System.out.println("November");break; case12: System.out.println("December");break; default: System.out.println("Hey,that'snotavalidmonth! ");break; } 3.4.5异常处理语句 JAVA编程语言提供一个异常机制用来帮助程序报告和处理错误。 当一个错误发生的时候,程序就产生一个异常。 即正常的程序路程被中断并且系统缓建想找到一个异常处理: 一个能处理特殊类型错误的代码块。 这个异常福利可以视图恢复错误或者如果它决定了错误是不可修复的,它提供一个较好退出程序的方法。 有三条语句可以处理异常: 1.try语句,它可以在异常产生的地方识别语句块。 2.catch语句,它必须和try语句一起用,它可是识别可以处理特定异常错误的语句块。 这个语句是在如果有一个特定的异常发生在try块中就被执行。 (3)finally语句,它必须跟try语句一起用,它可以识别语句块,这些语句块是在不管在try块中是否有错误发生被执行的。 下面是这三个语句的语法格式: try{ 语句(参数) }catch(异常错误类型名字){ 语句(参数) }finally{ 语句(参数) } 上面简述了由JAVA编程语言提供的用来报告和处理错误的语句。 但是,另外的因素和原因,比如运行和检查异常之间的差异以及异常类的分级结构(代表异常的不同种类)在使用异常机制的时候起着重要的作用。 3.4.6分支语句 JAVA编程语言支持下面的三种分支结构: break语句 continue语句 return语句 下面逐个介绍: (1)break语句 break语句有两种形式: 未标志的和标志的。 你在前面就已经看过了未标志的break语句。 一个未标志的break语句终止swtich语句,控制流程马上转到switch语句下方的语句。 下面的例程BreakDemo,它包含了一个for循环查找数组中特定的数值: publicclassBreakDemo{ publicstaticvoidmain(String[]args){ int[]arrayOfInts={32,87,3,589,12,1076, 2000,8,622,127}; intsearchfor=12; inti=0; booleanfoundIt=false; for(;i if(arrayOfInts[i]==searchfor){ foundIt=true; break; } } if(foundIt){ System.out.println("Found"+searchfor+"atindex"+i); }else{ System.out.println(searchfor+"notinthearray"); } } } 当数值被找到的时候,这个break语句终止了for循环。 控制流程就转到for语句的下面的语句继续执行。 这个程序的输出为: Found12atindex4 3.4.6分支语句 未标志形式的break语句被用来终止内部的switch、for、while或者do-while。 而标志形式的break语句终止一个外部的语句,它是通过在break语句中使用一个标志来实现的。 下面的例程BreakWithLabelDemo跟前面的例子有点相似,只不过它是在一个两维数组中搜索一个数值。 利用两个嵌套的for循环遍历了整个数组。 当数值被找到了,标志形式的break语句就终止标志的search语句,这个search语句是在for循环外部的: publicclassBreakWithLabelDemo{ publicstaticvoidmain(String[]args){ int[][]arrayOfInts={{32,87,3,589}, {12,1076,2000,8}, {622,127,77,955} }; intsearchfor=12; inti=0; intj=0; booleanfoundIt=false; search: for(;i for(j=0;j if(arrayOfInts[i][j]==searchfor){ foundIt=true; breaksearch; } } } if(foundIt){ System.out.println("Found"+searchfor+"at"+i+","+j); }else{ System.out.println(searchfor+"notinthearray"); } } } 这个程序的输出为: Found12at1,0 这个语法看起来可能有点费解。 break语句终止了标志语句,它不能将控制流程转到这个标志处。 控制流程迅速将标志(终止的)后面的语句。 2)continue语句 你可以使用continue语句来跳过当前的for、while或者do-while循环。 未标志形式跳到内部循环体的末尾处并且计算控制循环的boolean表达式,跳过循环的其它部分。 下面的例程ContinueDemo遍历字符串中的所有字母。 如果当前字母不是一个p,contiue语句就忽略循环的其它部分并且处理下一个字符。 如果它是一个p字母,程序就对计数器增1,再将p转换维大写字母: publicclassContinueDemo{ publicstaticvoidmain(String[]args){ StringBuffersearchMe=newStringBuffer( "peterpiperpickedapeckofpickledpeppers"); intmax=searchMe.length(); intnumPs=0; for(inti=0;i //interestedonlyinp's if(searchMe.charAt(i)! ='p') continue; //processp's numPs++; searchMe.setCharAt(i,'P'); } System.out.println("Found"+numPs+"p'sinthestring."); System.out.println(searchMe); } } 这个程序的输出为: Found9p'sinthestring. PeterPiPerPickedaPeckofPickledPePPers 标志形式的continue语句将忽略外部给定标志的循环。 下面的例程ContinueWithLabelDemo,它使用了一个嵌套的循环来搜索一个子字符串。 程序如下: publicclassContinueWithLabelDemo{ publicstaticvoidmain(String[]args){ StringsearchMe="Lookforasubstringinme"; Stringsubstrin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 34 控制 流程 语句
![提示](https://static.bdocx.com/images/bang_tan.gif)