前言:

1、在java中switch后的表达式的类型只能为以下几种:byte、short、char、int(在Java1.6中是这样)、枚举,

   在java1.7后支持了对string的判断

2、case后面必须跟常量,必须要常量,常量用final修饰.

目录:

1.常规语法

2.正确案例分析

3.错误案例分析

 

一、常规语法

1..switch参数范围

     switch(A),括号中A的取值可以是byte、short、int、char、String,还有枚举类型,应用举例:

//(1)byte 

 

  byte baction=2; 

 

  switch (baction) 

 

  { 

 

      case 1:System.out.print(baction);break; 

 

      case 2:System.out.print(baction);break; 

 

  } 

 

  //(2)short 

 

  short saction=3; 

 

  switch (saction) 

 

  { 

 

      case 1:System.out.print(saction);break; 

 

      case 3:System.out.print(saction);break; 

 

  } 

 

  //(3)int 

 

  int iaction=4; 

 

  switch (iaction) 

 

  { 

 

      case 1:System.out.print(iaction);break; 

 

      case 4:System.out.print(iaction);break; 

 

  } 

 

  //(4)char 

 

  char caction='a'; 

 

  switch (caction) 

 

  { 

 

      case 1:System.out.print(caction);break; 

 

      case 'a':System.out.print(caction);break; 

 

  } 

 

  //(5)String 

 

  String straction="abc"; 

 

  switch (straction) 

 

  { 

 

      case "1":System.out.print(straction);break; 

 

      case "abc":System.out.print(straction);break; 

 

  } 

 

  //(6)枚举 

 

  String fullStr="00000000000000"; 

 

  CompletedProgressEnum action=CompletedProgressEnum.basic; 

 

  StringBuilder sb = new StringBuilder(fullStr); 

 

  switch (action) 

 

  { 

 

      case basic:sb.replace(0, 2,CompletedProgressEnum.basic.getValue()); break; 

 

      case edu:sb.replace(2, 4,CompletedProgressEnum.edu.getValue());break; 

 

  }

 

注意:long类型不能作为switch参数。

2.case子句

     case B;case是常量表达式,也就是说B的取值只能是常量(需要定义一个final型的常量)或者int、byte、short、char(比如1、2、3、200000000000(注意了这是整型))。

     

     如果没有符合的case,就执行default,default为非必选项。

 

二.正确案例分析:

1.标准型(case后面都有break语句,case后的值都是整数)

int i=3;  

 

  switch(i)  

 

  {  

 

  case 1:  

 

  System.out.println(1);  

 

  break;  

 

  case 2:  

 

  System.out.println(2);  

 

  break;   

 

  default:  

 

  System.out.println("default");  

 

  break;  

 

  }

 

2.常量型(case后面都有break语句,case后的值都是常量)

private final int NUM1=1; 
  private final int NUM2=1; 
  int i=3; 
  switch(i) 
  { 
  case NUM1: 

 

  System.out.println(1); 

 

  break; 

 

  case NUM2: 

 

  System.out.println(2); 

 

  break;  

 

  default: 

 

  System.out.println("default"); 

 

  break; 

 

  }

 

三.错误案例分析:

1.第二种情况容易出错的情况:

 发现问题

private int CLICK_QUERY = 1; 

 

  private int CLICK_RESET = 2; 

 

  @Override 

 

  public void onClick(View v) 

 

  { 

 

  int tag = (Integer) v.getTag(); 

 

  switch (tag) 

 

  { 

 

    case CLICK_QUERY: 

 

    query(); 

 

    break; 

 

    case CLICK_RESET: 

 

    reset(); 

 

    break; 

 

  } 

 

  }

编译时一直报错:CLICK_QUERY 和CLICK_RESET——case expressions must be constant expressions

解决问题:

          case后面必须跟常量,必须要常量,将上面两个变量声明为final即可。

private final int CLICK_QUERY = 1;

private final int CLICK_RESET = 2;

2.下面是switch的简单写法:

switch(A){ 

 

  case B; 

 

  }

   final型的变量也是有要求的,也即是它必须是编译时的常量,怎么讲呢,看下面的程序段:

final int a = 0;

final int b;

   第二个语句就是在编译时不能够被识别出值的变量,因为它没有初始化,当然,这条语句也是错误的。所以总结case后的值可以是常数值或final型的值。再看下面的程序段:

byte a = 11; 

 

    switch(a){// C 

 

    case 11 : System.out.println(" 11 "); break; 

 

    case 225 : System.out.println(" 11 "); break;// D 

 

    }

    该代码正确吗?答案是否定的。虽然在 C 处是合法的也即是byte型的a值可以出现在switch中,但是 D处的语句也即是第二个case后的值是225大小超过了byte的范围,所以是错误的。再就是case后的值不能出现重复。因此在使用中要注意。

 

3.忘记写break的错误

   再就是在使用switch-case中最容易忽视的就是忘记在每个case后处理完后忘记写上break;语句。那它带来的后果是什么呢,下面小程序段会告诉你:

byte a = 2; 

 

    switch(a){ 

 

    case 1 : System.out.println(" A "); 

 

    case 2 : System.out.println(" B "); 

 

    case 3 : System.out.println(" C "); 

 

    case 4 : System.out.println(" D "); 

 

    default : System.out.println(" default "); 

 

    }

=========输出结果为:

default 

--------------------------