TShopping

 找回密碼
 註冊
搜索
查看: 1483|回復: 0

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

[複製鏈接]
發表於 2016-12-29 08:35:25 | 顯示全部樓層 |閱讀模式
 
Push to Facebook

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後的值都是整數)

  1. int i=3;
  2. switch(i)
  3. {
  4.   case 1:
  5.     System.out.println(1);
  6.     break;

  7.   case 2:
  8.     System.out.println(2);
  9.     break;  

  10.   default:
  11.     System.out.println("default");
  12.     break;
  13. }
複製代碼



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

  1. private final int NUM1=1;
  2. private final int NUM2=1;
  3. int i=3;
  4. switch(i)
  5. {
  6.   case NUM1:
  7.     System.out.println(1);
  8.     break;
  9.   case NUM2:
  10.     System.out.println(2);
  11.     break;  
  12.   default:
  13.     System.out.println("default");
  14.     break;
  15. }
複製代碼



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

  1. int i=3;
  2. int b = 2;
  3. switch(i)
  4. {
  5.   case '类名.getId()':
  6.     System.out.println(1);
  7.     break;

  8.   case 'b'
  9.     System.out.println(2);
  10.     break;  

  11.   default:
  12.     System.out.println("default");
  13.     break;
  14. }
複製代碼



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

1 ).第二種情況容易出錯的情況:

發現問題

  1. private int CLICK_QUERY = 1;
  2. private int CLICK_RESET = 2;
  3. @Override
  4. public void onClick(View v)
  5. {
  6.   int tag = (Integer) v.getTag();
  7.   switch (tag)
  8.   {
  9.     case CLICK_QUERY:
  10.       query();
  11.       break;

  12.     case CLICK_RESET:
  13.       reset();
  14.       break;
  15.   }
  16. }
複製代碼


   編譯時一直報錯: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型的值。再看下面的程序段:

  1. public class TestSwitch {
  2.   public static void main(String[] args){
  3.     byte a = 11;
  4.     switch(a){
  5.       case 11 : System.out.println(" 11 "); break;
  6.       case 225 : System.out.println(" 11 "); break;// D
  7.     }
  8.   }
  9. }
複製代碼


    該代碼正確嗎?答案是否定的。雖然在C 處是合法的也即是byte型的a值可以出現在switch中,但是D處的語句也即是第二個case後的值是225大小超過了byte的範圍,所以是錯誤的。再就是case後的值不能出現重複。因此在使用中要注意。

3. 忘記寫break的錯誤

   再就是在使用switch-case中最容易忽視的就是忘記在每個case後處理完後忘記寫上break;語句。那它帶來的後果是什麼呢,下面小程序段會告訴你:

  1. public class TestSwitchCase {
  2.   public static void main(String[] args){
  3.     byte a = 2;
  4.       switch(a){
  5.         case 1 : System.out.println(" A ");

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

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

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

  9.         default : System.out.println(" default ");
  10.       }
  11.   }
  12. }

  13. =========输出结果为:
  14. B
  15. C
  16. D
  17. default
  18. --------------------------
複製代碼

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


文章來源


 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-12-8 00:25 , Processed in 0.241247 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表