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){
- 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了。
文章來源 |