http://m.blog.csdn.net/blog/tianyazaiheruan/8988420
今天陳紅軍老師在用到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了。
轉載請指明:本文來自楊凱專屬頻道