Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Основы Языка
Раздел: Операторы управления
Оператор переключения
Домашняя страница > Изучение Языка Java > Основы языка

Оператор переключения

В отличие от этого if-then и if-then-else операторы, switch у оператора может быть много возможных путей выполнения. A switch работы с byte, short, char, и int примитивные типы данных. Это также работает с перечислимыми типами (обсужденный в Перечислимых Типах), String class, и несколько специальных классов, которые обертывают определенные типы примитивов: Character, Byte, Short, и Integer (обсужденный в Числах и Строках).

Следующий пример кода, SwitchDemo, объявляет int именованный month чье значение представляет месяц. Код выводит на экран имя месяца, основанного на значении month, использование switch оператор.


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 печатается к стандартному выводу.

Тело a switch оператор известен как блок переключателя. Оператор в switch блок может быть маркирован один или больше case или default метки. switch оператор оценивает свое выражение, затем выполняет все операторы, которые следуют за соответствием case метка.

Вы могли также вывести на экран имя месяца с if-then-else операторы:

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

Решение, использовать ли if-then-else операторы или a switch оператор основан на удобочитаемости и выражении, которое тестирует оператор. if-then-else оператор может протестировать выражения, основанные на диапазонах значений или условий, тогда как a switch оператор тестирует выражения, базируемые только на единственном целом числе, перечисляемом значении, или String объект.

Другое интересное место break оператор. Каждый break оператор завершает включение switch оператор. Поток управления продолжается с первым оператором после switch блок. break операторы необходимы потому что без них, операторов в switch блоки проваливаются: Все операторы после соответствия case метка выполняется в последовательности, независимо от выражения последующих case метки, до a break с оператором встречаются. Программа SwitchDemoFallThrough выставочные операторы в a 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 оператор. Используя a break рекомендуется так, чтобы изменение кода было легче и менее подверженным ошибкам. default описатели секции все значения, которые явно не обрабатываются одним из case разделы.

Следующий пример кода, 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

Используя Строки в операторах переключения

В Java SE 7 и позже, можно использовать a String объект в switch выражение оператора. Следующий пример кода, StringSwitchDemo, выводит на экран число месяца, основанного на значении String именованный month:


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.

String в switch выражение по сравнению с выражениями, связанными с каждым case маркируйте как будто String.equals метод использовался. Для StringSwitchDemo пример, чтобы принять любой месяц независимо от случая, month преобразовывается в нижний регистр (с toLowerCase метод), и все строки, связанные с case метки находятся в нижнем регистре.

Отметьте: Этот пример проверяет если выражение в switch оператор null. Гарантируйте что выражение в любом switch оператор не является нулем, чтобы предотвратить a NullPointerException от того, чтобы быть брошенным.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: если тогда и Операторы, "если тогда еще"
Следующая страница: в то время как и делают - в то время как Операторы