java中使用switch-case的用法及注意事項超全總結

y_keven發表於2013-05-29

  今天陳紅軍老師在用到switch的時候,這種設計到最基本的內容,可能忘記它的一些基本語法,出現了一些錯誤,所以即興從各種資料查詢總結了下面的內容,希望可以幫助那些正在困擾switch錯誤和各種細節問題的朋友! 

1.switch-case注意事項:

    switch(A),括號中A的取值只能是整型或者可以轉換為整型的數值型別,比如byte、short、int、char、還有列舉;需要強調的是:long和String型別是不能作用在switch語句上的。

     case B:C;case是常量表示式,也就是說B的取值只能是常量(需要定義一個final型的常量,後面會詳細介紹原因)或者int、byte、short、char(比如1、2、3、200000000000(注意了這是整型)),如果你需要在此處寫一個表示式或者變數,那麼就要加上單引號; case後的語句可以不用大括號,就是C不需要用大括號包裹著;

     default就是如果沒有符合的case就執行它,default並不是必須的.

2.案例分析:

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; 
} 


 

3.表示式型(case後面都有break語句,case後的值都是表示式)

int i=3; 

int b = 2;

switch(i) 

{ 

case '類名.getId()': 

System.out.println(1); 

break; 

case 'b' 

System.out.println(2); 

break;  

default: 

System.out.println("default"); 

break; 

}


 

3.使用switch時的出錯分析:

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;

}

   A部分中的值必須是int型的,或者是能夠自動進行飲試轉換成int型的表示式。也就是說A部分可以是byte\short\char\int型(因為這幾種型別都可以自動轉換為int型)的。

   其次要強調的是該程式中B部分的值必須是單個byte\short\char\int型的值,或者是final型的變數。

但是final型的變數也是有要求的,也即是它必須是編譯時的常量,怎麼講呢,看下面的程式段:

final int a = 0;

final int b;

   第二個語句就是在編譯時不能夠被識別出值的變數,因為它沒有初始化,當然,這條語句也是錯誤的。所以總結case後的值可以是常數值或final型的值。再看下面的程式段:

public class TestSwitch {

 public static void main(String[] args){

  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;語句。那它帶來的後果是什麼呢,下面小程式段會告訴你:

public class TestSwitchCase {

 public static void main(String[] args){

  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 ");

  }

 }

}

=========輸出結果為:

 B 

 C 

 D 

 default 

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


 

看到了嗎?連default都執行,注意結束符break;就OK了。

   轉載請指明:本文來自楊凱專屬頻道

相關文章