Spec-Zone .ru
спецификации, руководства, описания, API
|
В отличие от этого 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
от того, чтобы быть брошенным.