switch語句break不能忘以及default不同位置的用法

Java之戳中痛點 - (5)switch語句break不能忘以及default不同位置的用法

原文地址:https://www.cnblogs.com/JsonShare/p/6999765.html

先看一段代碼:

複製代碼

public class Test{   
    public static void main(String[] args){   
        System.out.println("2 = "+ toNumberCase(2));   
    }   
}   
      
public static String toNumberCase(int n){   
    String str = "";   
    switch(n){   
        case 0:  str = "我是0";   
        case 1:  str = "我是1";   
        case 2:  str = "我是2";   
        case 3:  str = "我是3";   
        case 4:  str = "我是4";   
        case 5:  str = "我是5";   
        case 6:  str = "我是6";   
        case 7:  str = "我是7";   
        case 8:  str = "我是8";   
        case 9:  str = "我是9";   
    }   
    return str;   
}   

結果是 "2 = 我是2" ?其實不是,結果是

 

先來分析一下:

由於每個case語句後面少加了break關鍵字。程序從”case 2"後面的語句開始執行,直到找到break語句結束,可惜的是我們的程序中沒有break語句,
於是在程序執行的過程中,str的賦值語句會執行多次,從等於"我是0"、等於"我是1”...等於"我是9",Switch語句執行結束了。於是結果就是如此了。

 

結論:switch-case語句,如果在每個case語句後面少加了break關鍵字。程序從該case分支繼續執行下一個分支,直到遇見break後或執行完最後一個分支,switch語句執行結束。記住在case語句後面隨手寫上break語句,養成良好的習慣。

 

PS:對於此類問題,還有一個簡單的解決辦法:修改Eclipse的警告級別。Performaces->Java->Compiler->Errors/Warnings->Potential Programming->problems,然後修改'switch' case fall-through爲Error級別,你如果沒有在case語句中加入break,Eclipse會直接報錯。

 

補充:defalut放在不同位置,對結果的影響

先看幾個例子:

例子1:

複製代碼

package com.test;

public class testbreak {
    public static void main(String[] args) {
        System.out.println("10 = "+ toNumberCase(10));   
    }
    public static String toNumberCase(int n){   
        String str = "";   
        switch(n){   
            default :  str = "我是default";
            case 0:  str = "我是0";  break;
            case 1:  str = "我是1";  break;
            case 2:  str = "我是2";  break;
            case 3:  str = "我是3";  break;
            case 4:  str = "我是4";  break;
            case 5:  str = "我是5";  break;
            case 6:  str = "我是6";  break;
            case 7:  str = "我是7";  break;
            case 8:  str = "我是8";  break;
            case 9:  str = "我是9";  break;
        }   
        return str;   
    }   
}

複製代碼

 結果:

例子2:

複製代碼

package com.test;

public class testbreak {
    public static void main(String[] args) {
        System.out.println("10 = "+ toNumberCase(10));   
    }
    public static String toNumberCase(int n){   
        String str = "";   
        switch(n){   
            case 0:  str = "我是0";  break;
            case 1:  str = "我是1";  break;
            case 2:  str = "我是2";  break;
            case 3:  str = "我是3";  break;
            case 4:  str = "我是4";  break;
            default :  str = "我是default";
            case 5:  str = "我是5";  break;
            case 6:  str = "我是6";  break;
            case 7:  str = "我是7";  break;
            case 8:  str = "我是8";  break;
            case 9:  str = "我是9";  break;
        }   
        return str;   
    }   
}

複製代碼

 結果:

 

 例子3:

複製代碼

package com.test;

public class testbreak {
    public static void main(String[] args) {
        System.out.println("10 = "+ toNumberCase(10));   
    }
    public static String toNumberCase(int n){   
        String str = "";   
        switch(n){   
            case 0:  str = "我是0";  break;
            case 1:  str = "我是1";  break;
            case 2:  str = "我是2";  break;
            case 3:  str = "我是3";  break;
            case 4:  str = "我是4";  break;
            case 5:  str = "我是5";  break;
            case 6:  str = "我是6";  break;
            case 7:  str = "我是7";  break;
            case 8:  str = "我是8";  break;
            case 9:  str = "我是9";  break;
            default :  str = "我是default";
        }   
        return str;   
    }   
}

複製代碼

 結果:

前3個例子,我把default放在不同的位置, 但是沒有加break

接下來再看幾個例子:

例子4:

複製代碼

package com.test;

public class testbreak {
    public static void main(String[] args) {
        System.out.println("10 = "+ toNumberCase(10));   
    }
    public static String toNumberCase(int n){   
        String str = "";   
        switch(n){   
            default :  str = "我是default"; break;
            case 0:  str = "我是0";  break;
            case 1:  str = "我是1";  break;
            case 2:  str = "我是2";  break;
            case 3:  str = "我是3";  break;
            case 4:  str = "我是4";  break;
            case 5:  str = "我是5";  break;
            case 6:  str = "我是6";  break;
            case 7:  str = "我是7";  break;
            case 8:  str = "我是8";  break;
            case 9:  str = "我是9";  break;
        }   
        return str;   
    }   
}

複製代碼

 結果:

 

例子5:

 

複製代碼

package com.test;

public class testbreak {
    public static void main(String[] args) {
        System.out.println("10 = "+ toNumberCase(10));   
    }
    public static String toNumberCase(int n){   
        String str = "";   
        switch(n){   
            case 0:  str = "我是0";  break;
            case 1:  str = "我是1";  break;
            case 2:  str = "我是2";  break;
            case 3:  str = "我是3";  break;
            case 4:  str = "我是4";  break;
            default :  str = "我是default"; break;
            case 5:  str = "我是5";  break;
            case 6:  str = "我是6";  break;
            case 7:  str = "我是7";  break;
            case 8:  str = "我是8";  break;
            case 9:  str = "我是9";  break;
        }   
        return str;   
    }   
}

複製代碼

結果:

 

 例子6:

複製代碼

package com.test;

public class testbreak {
    public static void main(String[] args) {
        System.out.println("10 = "+ toNumberCase(10));   
    }
    public static String toNumberCase(int n){   
        String str = "";   
        switch(n){   
            case 0:  str = "我是0";  break;
            case 1:  str = "我是1";  break;
            case 2:  str = "我是2";  break;
            case 3:  str = "我是3";  break;
            case 4:  str = "我是4";  break;
            case 5:  str = "我是5";  break;
            case 6:  str = "我是6";  break;
            case 7:  str = "我是7";  break;
            case 8:  str = "我是8";  break;
            case 9:  str = "我是9";  break;
            default :  str = "我是default"; break;
        }   
        return str;   
    }   
}

複製代碼

  結果:

 再看這3個例子,每個都加break

 

總結:

基礎邏輯都是:default的運用,是當switch語句裏,所有的case語句都不滿足條件時,則執行default語句
在這裏我們要分幾種情況討論:

default在switch開頭:
若所有case都不滿足條件,則執行default語句,並執行default語句之後的case語句,直到break或結束

default在switch中間:(同上)
若所有case都不滿足條件,則執行default語句,並執行default語句之後的case語句,直到break或結束

default在switch末尾:
若所有case語句都不滿足條件,則執行default語句,結束;若有case滿足,則執行case語句直到遇到break或switch語句結束,所以default在最後一行時break可以省略不寫(但是不建議省略,以求嚴謹)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章