Java程序流程控制

Java程序流程控制

程序流控制语句可以使程序运行时,有条件地执行或重复重复执行某些语句,改变程序正规的顺序流向。Java提供了如下4类程序流控制语句

  • 循环语句:包括while语句,do while语句和for语句
  • 分支语句:包括if语句和switch语句
  • 跳转语句:包括break语句,continue语句,label语句,return语句
  • 异常处理语句:包括try catch finally语句和throw语句

1. while语句和do while语句

  1. 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);
        } 
    }
    
  2. 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可以是单语句,也可以是语句块。

注意:

  1. if关键字之后的逻辑表达式必须得到一个逻辑值,不能像其他语言那样以数值来代替。因为Java不提供数值与逻辑值之间的转换。例如,C语言中的语句形式:

    int x = 3;
    if(x){...}
    

    在Java中应该写为:

    int x = 3;
    if(x !=0){...}
    
  2. 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之后的语句。
说明

  1. switch中的表达式的值,可以是整型,枚举类型或String类的对象。整型表达式须是int兼容的类型,既可以是byte,short,char,int,不允许使用浮点型(float,double)或long型,并且各case子句中c1,c2,…,ck是int型或字符型常量。
  2. switch语句中各case分支既可以是单条语句,也可以是由多条语句组成的语句组,该语句组可以不用{}括起来
  3. default子句是可选的,并且最后一个break语句可以省略
  4. 不论执行那个case分支,程序流都会顺序执行下去,直到遇到break语句为止。可以利用这个特点简化程序的编写。
  5. 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;
  1. 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");
              }
          }
      }
      
      
  2. 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");
          }
      }
      
  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值