简单,可复制

点点滴滴,尽在文中

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/16/2820839.html

英文出自 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

不像if-then和if-then-else语句,switch语句可以有多个可能的执行路径。switch工作于于byte,shortchar, int原生类型。它也作用于枚举类型,String类和几个特殊的原生类型包装类:CharacterByteShort, and Integer。

下面的代码例子,SwitchDemo,声明一个名称为month的int类型,它的值表示月份。代码使用switch语句,根据month的值,展示month的名字。

public class SwitchDemo {
    public static void main(String[] args) {

        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break;
        }
        System.out.println(monthString);
    }
}

这个情况下,输出August到标准输出。

switch语句的正文,如所知是一个switch块。switch块的语句,可以标记一个或多个default标签,switch语句计算它的表达式,然后执行对应的case标签跟随的所有代码。

使用if-then-else语句,显示month对应的名字:

int month = 8;
if (month == 1) {
    System.out.println("January");
} else if (month == 2) {
    System.out.println("February");
}
...  // and so on

决策何时使用if-then-else语句和switch语句,是根据表达式语句被测试的可读性。if-then-else语句可以测试表达式的值的范围和条件表达式,而switch语句对表达式的测试,只能基于数字,枚举类型,String对象。

另外一个兴趣点是break语句。每个break语句都可以结束switch语句封闭块。控制流从switch块的第一个语句开始持续,break语句是必须的,没有了它,switch块的语句会告吹:符合的case标签后所有的代码,会按照顺序执行,不用管后面的case标签的表达式,一直到一个break语句。程序SwitchDemoFallThrough 显示switch块的语句失败。程序根据整数month,显示一年的月份:

public class SwitchDemoFallThrough {

    public static void main(String args[]) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
                     break;
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

 

代码输出是:

August
September
October
November
December

从技术层面讲,最后的break语句非必须,因为控制流已经离开了switch语句。使用break是推荐的,因为修改代码比较容易,减少易出现的错误。如果case片段的每一个值都无法处理,那么default片段会处理所有的值。

下面的代码例子,SwitchDemo2,显示一个语句可以有多个case标签。代码例子计算特定月份的天数:

class SwitchDemo2 {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1: case 3: case 5:
            case 7: case 8: case 10:
            case 12:
                numDays = 31;
                break;
            case 4: case 6:
            case 9: case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}

 

代码输出是:

Number of Days = 29

switch语句使用Strings

java7及后续版本,可以在switch语句的表达式中使用String对象。接下来的代码例子,StringSwitchDemo,根据月份的名字,显示月份的整数值:

public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default: 
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

代码输出是8.

switch表达式的String,对比每个case标签关联的表达式,String.equals 会被使用。为了让StringSwitchDemo例子接受任何月份的名字,不考虑大小写,month被转换为小写(使用toLowerCase方法),而case标签关联的字符串都是用小写。

注意:例子检查switch语句中的表达式是否null。确定switch语句的任何表达式不是null,避免抛出一个NullPointerException。

posted on 2012-12-16 22:39  ggjucheng  阅读(1689)  评论(0编辑  收藏  举报