第四章 流控制

📅 2026/7/5 1:57:17 👤 编程新知 🏷️ 技术资讯
第四章 流控制 与C、C相同Java程序通过流控制来执行程序流完成语句组成的。语句可以是单一的一条语句(如cab;)也可以是复合语句。下面我们分别来介绍Java中的流控制语句包括1.分支语句if-elsebreakswitchreturn.2.循环语句whiledo-whileforcontinue.3.例外处理语句try-catch-finallythrow最后我们简单介绍一下注释语句。§4.1分支语句分支语句提供了一种控制机制使得程序的执行可以跳过这些语句不执行而转去执行特定的语句。4.1.1条件语句if-else.if-else语句根据判定条件的真假来执行两种操作中的一种格式为if(boolean-expression)statement1;[elsestatement2;]1.布尔表达式boolean-expression是任意一个返回布尔型数据的达式(这比C、C的限制要严格)。2.每个单一的语句后都必须有分号。3.语句statement1statement2可以为复合语句这时要用大括号{}括起。建议对单一的语句也用大括号括起这样程序的可读性强而且有利于程序的扩充(可以在其中填加新的语句)。{}外面不加分号。4.else子句是任选的。5.若布尔表达式的值为true则程序执行statement1否则执行statement2。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(Stringargs[]){double d123.4;double d235.1;if(d2d1)System.out.println(d2d1);elseSystem.out.println(d1d2);} }运行结果为C:\java CompareTwo35.123.4例4.2判断某一年是否为闰年。闰年的条件是符合下面二者之一①能被4整除但不能被100整除;②能被4整除又能被100整除。public class LeapYear{public static void main(String args[]){int year1989;//method1if((year%40year%100!0)||(year%4000))System.out.println(yearisaleapyear.);elseSystem.out.println(yearisnotaleapyear.);year2000;//method2boolean leap;if(year%4!0)leapfalse;else if(year%100!0)leaptrue;else if(year%400!0)leapfalse;elseleaptrue;if(leaptrue)System.out.println(yearisaleapyear.);elseSystem.out.println(yearisnotaleapyear.);year2050;//method3if(year%40){if(year%1000){if(year%4000)leaptrue;elseleapfalse;}elseleapfalse;}elseleapfalse;if(leaptrue)System.out.println(year is a leap year.);elseSystem.out.println(year is not a leap year.);}}运行结果为C:\java LeapYear1989 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多分支语句switchswitch语句根据表达式的值来执行多个操作中的一个它的般格式如下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.case分支中包括多个执行语句时可以不用大括号{}括起。6.switch语句的功能可以用if-else来实现但在某些情况下使switch语句更简炼可读性强而且程序的执行效率提高。7.举例例4.3.根据考试成绩的等级打印出百分制分数段。public class GradeLevel{public static void main(String args[]){System.out.println(\n**firstsituation**);char gradeC;//normaluseswitch(grade){case A:System.out.println(grade is 85100);break; case B:System.out.println(grade is 7084);break; case C:System.out.println(grade is 6069);break; case D:System.out.println(grade is 60);break; default:System.out.println(input error);} System.out.println(\n**secondsituation**);gradeA;∥creat error without break statementswitch(grade){case A:System.out.println(gradeis85100);case B:System.out.println(gradeis7084);case C:System.out.println(gradeis6069);case D:System.out.println(gradeis60);default:System.out.println(inputerror);} System.out.println(\n**thirdsituation**);gradeB;∥severalcasewithsameoperationswitch(grade){case A:case B:case C:System.out.println(gradeis60);break; case D:System.out.println(gradeis60);break; default:System.out.println(inputerror);}}}运行结果为C:\java GradeLevel****first situation****C is 6069****second situation****A is 85100A is 7084A is 6069A is 60input error****third situation****B is 60从该例中我们可以看到break语句的作用。4.1.3break语句1.在switch语中break语句用来终止switch语句的执行。使程序switch语句后的第一个语句开始执行。2.在Java中可以为每个代码块加一个括号一个代码块通常用大括号{}括起来的一段代码。加标号的格式如下BlockLabel:{codeBlock}break语句的第二种使用情况就是跳出它所指定的块并从紧?该块的第一条语句处执行。其格式为break BlockLabel;例如a:{......//标记代码块ab:{......//标记代码块bc:{......//标记代码块cbreakb;……//willnotbeexecuted}……//willnotbeexecuted}……//willnotbeexecuted}……/executefromhere}3.与C、C不同Java中没有goto语句来实现任意的跳转因为goto语句破坏程序的可读性而且影响编译的优化。但是从上例可以看出Java用break来实现goto语句所特有的一些优点。如果break后所指定的标号不是一个代码块的标号而是一个语句则这时break完全实现goto的功能。不过应该避免这种方式的使用。4.1.4返回语句returnreturn语句从当前方法中退出返回到调用该方法的语句处继续程序的执行。(有关方法的内容我们将在第六章详细讲)。返回语句有两种格式1.return expression返回一个值给调用该方法的语句返回值的数据类型必须与方法声明中的返回值类型一致。可以使用强制类型转换来使类型一致。2.return当方法说明中用void声明返回类型为空时应使用这种格式不返回任何值。return语句通常用在一个方法体的最后以退出该方法并返一个值。Java中单独的return语句用在一个方法体的中间时会产生编译错误因为这时有一些语句执行不到。但可以通过把return语句嵌入某些语句(如if-else)来使程序在未执行完方法中的所有语句时退出例如int method (int num){∥return num;∥will cause compile time errorif(num0)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.2do-while语句do-while语句实现直到型循环它的一般格式为[initialization]do{body;[iteration;]}while (termination);1.do-while语句首先执行循环体然后计算终止条件若结果为true则循环执行大括号中的语句直到布尔表达式的结果为false。2.与while语句不同的是do-while语句的循环体至少执行一次是直到型循环的特点。4.2.3for语句for语句也用来实现当型循环它的一般格式为for (initialization;termination;iteration){body;}1.for语句执行时首先执行初始化操作然后判断终止条件是否满足如果满足则执行循环体中的语句最后执行迭代部分。完成一次循环后重新判断终止条件。2.可以在for语句的初始化部分声明一个变量它的作用域为一个for语句。3.for语句通常用来执行循环次数确定的情况(如对数组元素进行操作)也可以根据循环结束条件执行循环次数不确定的情况。4.在初始化部分和迭代部分可以使用逗号语句来进行多个动作。逗号语句是用逗号分隔的语句序列。例如for(i0j10;ij;ij--){……}5.初始化、终止以及迭代部分都可以为空语句(但分号不能)三者均为空的时候相当于一个无限循环。4.2.4continue语句1.continue语句用来结束本次循环跳过循环体中下面尚未执的语句接着进行终止条件的判断以决定是否继续循环。对于for语句在进行终止条件判断前还要先执行迭代语句。它的格式为continue;2.也可以用continue跳转到括号指明的外层循环中这时的格式为continue outerLable;例如outer:for(int i0;i10;i){∥外层循环for(int j0;j20;j){∥内层循环if(ji){…… continueouter;}……}……}该例中当满足ji的条件时程序执行完相应的语句后跳转至外层循环执行外层循环的迭代语句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 n10sum0;∥initializationwhile(n0){∥terminationsumn;∥bodyn--;∥iteration}System.out.println(sumissum);System.out.println(\n**do_whilestatement**);n0;∥initializationsum0;do{sumn;∥bodyn;∥iteration}while(n10);∥terminationSystem.out.println(sumissum);System.out.println(\n**forstatement**);sum0;for(inti1;i10;i){∥initializationterminationiterationsumi;}System.out.println(sumissum);}}运行结果为C:\java Sum**whilestatement**sum is 55**do_while statement**sum is 55**for statement**sum is 55可以从中来比较这三种循环语句从而在不同的场合选择合适的语句。例4.5求100200间的所有素数public class PrimeNumber{public static void main(String args[]){System.out.println(**prime numbers between 100 and 200**);intn0;outer:for(inti101;i200;i2){∥outer loopint k15;∥select for convinence for(int j2;jk;j){∥innerlopif(i%j0)continue outer;}System.out.print(i);n;∥outputanewlineif(n10)∥after10numberscontinue;System.out.println();n0;}System.out.println();}}运行结果为C:\java PrimeNumber**prime numbers between 100 and 200**101 103 107 109 113 127 131 137 139 149151 157 163 167 173 179 181 191 193 197199该例通过一个嵌套的for语句来实现。§4.3例外处理语句例外处理语句包括try、catch、finally以及throw语句。与C、C相比例外处理语句是Java所特有的。我们将在第八章作专门的介绍。§4.4注释语Java中可以采用三种注释方式1∥ 用于单行注释。注释从∥开始终止于行尾。2/*...*/用于多行注释。注释从/*开始到*/结束且这种注释不能互相嵌套。3/**...*/是Java所特有的doc注释。它以/**开始到*/结束。这种注释主要是为支持JDK工具javadoc而采用的。javadoc能识别注释中用标记标识的一些特殊变量并把doc注释加入它所生成的HTML文件。