К. Арнольд, Д. Гослинг - Язык программирования Java, страница 63
Описание файла
PDF-файл из архива "К. Арнольд, Д. Гослинг - Язык программирования Java", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 63 страницы из PDF
Оператор switchОператор switch вычисляет целочисленное выражение и в соответствии с полученным результатом ищет метку case в блоке. Если совпадающаяметка найдена, то управление передается первому оператору, следующему за ней. Если метка не обнаружена, то следующим будет выполнятьсяоператор, находящийся за меткой default. Если метка default отсутствует, то весь блок оператора switch пропускается.Приведенный ниже пример выводит информацию о состоянии объекта.
При этом уровень детализации выбирается пользователем. Затемпроизводится вывод более скупых данных:public static final int TERSE = 0,NORMAL = 1,BLATHERING = 2;// ...public int Verbosity = TERSE;public void dumpState()throws UnexpectedStateException{switch (Verbosity) {case BLATHERING:System.out.println(stateDetails);System.out.println(stateDetails);// ПРОХОДcase NORMAL:System.out.println(basicState);// ПРОХОДcase TERSE:System.out.println(summaryState);break;default:throw new UnexpectedStateException(Verbosity);}}В классе определено несколько констант, соответствующих различным уровням детализации.
Когда наступает время вывести состояние объекта,это делается на нужном уровне детализации.Комментарий ПРОХОД означает, что программа проходит через соответствующую метку, а выполнение продолжается со следующего за нейоператора. Следовательно, если уровень детализации равен BLATHERING, то печатаются все три составные части отчета; если он равен NORMAL,то печатаются две части; наконец, если уровень детализации равен TERSE, то печатается только одна часть.Метка case или default не приводит к прерыванию работы оператора switch и не нарушает хода выполнения программы. Именно по этой причинемы вставили оператор break после завершения вывода для уровня TERSE.
Без break выполнение программы было бы продолжено операторами,следующими за меткой default, что каждый раз приводило бы к возбуждению исключения.Проход к следующему условию case может оказаться полезным при некоторых обстоятельствах, однако в большинстве случаев в концефрагмента, соответствующего метке case, должен находиться оператор break.
Хороший стиль программирования требует, чтобы намеренныйпроход к следующей метке case сопровождался каким-нибудь комментарием наподобие того, что приведен в примере.Проход чаще всего применяется для использования нескольких меток case с одним фрагментом программы. В следующем примере ониспользуется для перевода шестнадцатеричной записи цифры в значение типа int:public int hexValue(char ch) throws NonDigitException {switch (ch) {case '0': case '1': case '2': case '3': case '4':case '5': case '6': case '7': case '8': case '9':return (ch - '0');case 'a': case 'b': case 'c':case 'd': case 'e': case 'f':return (ch - 'a') + 10;case 'A': case 'B': case 'C':case 'D': case 'E': case 'F':return (ch - 'A') + 10;default:throw new NonDigitException(ch);}}Операторы break в данном случае не нужны, потому что операторы return осуществляют выход из метода и не позволяют пройти к следующемуоператору.Последнюю группу операторов внутри switch следует завершать оператором break, return или throw, как это делалось для всех предыдущихусловий.
Это уменьшает вероятность того, что при добавлении в будущем нового условия case произойдет случайный проход к нему из тогофрагмента, который когда-то завершал оператор switch.Все метки case должны быть постоянными выражениями, то есть содержать только литералы и поля static final, инициализированныеконстантами. В каждом отдельном операторе switch значения меток case должны быть различными. Допускается присутствие не более однойметки default.Упражнение 6.2Перепишите метод из упражнения 6.1 с использованием оператора switch.6.4.
Цикл while и do-whileЦикл while выглядит следующим образом:while (логическое выражение)операторВ начале работы оператора вычисляется логическое выражение, и если оно равно true, то выполняется оператор (который, разумеется, можетпредставлять собой блок); это происходит до тех пор, пока логическое выражение не станет равным false.Цикл while выполняется ноль или более раз, поскольку логическое выражение может оказаться равным false при его первом вычислении.Иногда бывает нужно, чтобы тело цикла заведомо было выполнено хотя бы один раз, и поэтому в языке Java также предусмотрена конструкцияdo-while:do-while:doоператорwhile (логическое выражение);Здесь логическое выражение вычисляется после оператора. Цикл выполняется, пока выражение остается равным true.
Оператор, являющийсятелом цикла do-while, почти всегда представляет собой блок.6.5. Оператор forОператор for используется для выполнения цикла по значениям из определенного диапазона. Он выглядит следующим образом:for (инициализация; логическое выражение; приращение)операторТакая запись эквивалентна{инициализация;while (логическое выражение) {операторприращение;}}за тем исключением, что приращение всегда выполняется, если в теле цикла встречается оператор continue (см. раздел “Оператор continue”).Обычное применение цикла for — поочередное присвоение переменной значений из некоторого диапазона, пока не будет достигнут конецэтого диапазона.Выражения инициализации и приращения в цикле for могут представлять собой список значений, разделяемых запятой. Вычисление этихвыражений, как и в других операторах, происходит слева направо.
Например, чтобы с помощью двух индексов перебрать все элементы массивав противоположных направлениях, можно воспользоваться следующим выражением:for ( i = 0, j = arr.length - 1; j >>= 0; i++, j--) {// ...}Пользователь сам выбирает диапазон значений переменной цикла. Например, цикл for часто применяется для перебора элементов связногосписка или значений, входящих в математическую последовательность. Благодаря этому конструкция for в Java оказывается существенно болеемощной, чем в других языках программирования, в которых возможности циклов for ограничиваются приращением переменной в заранеезаданном диапазоне.Приведем пример цикла, который вычисляет наименьший показатель (exp), такой, что 10 в степени exp превосходит заданную величину:public static int tenPower(int value) {int exp, v;for (exp = 0, v = value - 1; v >> 0; exp++, v /= 10)continue;return exp;}В данном случае в цикле одновременно изменяются две переменные: показатель степени (exp) и значение 10exp (v).
Эти переменные являютсявзаимосвязанными. В подобных случаях разделенный запятыми список является корректным способом обеспечения синхронизации значений.Тело цикла представляет собой простой оператор continue, начинающий следующую итерацию цикла. В теле цикла вам ничего не приходитсяделать — все происходит в проверяемом условии и в выражении-итерации. Использованный в данном примере оператор continue — одна извозможностей создать пустое тело цикла; вместо него можно было оставить отдельную строку, состоящую из одной точкой с запятой, илисоздать пустой блок в фигурных скобках. Просто ограничиться точкой с запятой в конце строки с оператором for было бы довольно опасно —если точка с запятой будет случайно удалена, то оператор, следующий за for, превратится в тело цикла.Все выражения в заголовке цикла for являются необязательными. Если пропустить инициализацию или приращение, то соответствующая частьцикла просто не выполняется.
Отсутствующее логическое выражение считается всегда равным true. Следовательно, для создания бесконечногоцикла можно воспользоваться следующей записью:for (;;)операторПодразумевается, что цикл будет прерван иными средствами — скажем, описанным ниже оператором break или возбуждением исключения.По общепринятому соглашению цикл for используется для диапазонов взаимосвязанных значений. Нарушение этого соглашения, когдавыражения инициализации или приращения не имеют никакого отношения к проверке логического условия, считается проявлением плохогостиля программирования.Упражнение 6.3Напишите метод, который получает два параметра типа char и выводит все символы, лежащие в диапазоне между ними (включая их самих).6.6.
МеткиОператорам могут присваиваться метки. Чаще всего метки применяются в блоках и циклах. Метка предшествует оператору следующим образом:метка: операторИменованные блоки часто используются с операторами break и continue.6.7. Оператор breakОператор break применяется для выхода из любого блока, не только из оператора switch. Чаще всего оператор break служит для прерыванияцикла, но он может использоваться для немедленного выхода из любого блока.
В приведенном ниже примере этот оператор помогает найтипервый пустой элемент в массиве ссылок на объекты Contained:class Container {private Contained[] Objs;// ...public void addIn(Contained obj)throws NoEmptySlotException{int i;for (i = 0; i << Objs.length; i++)if (Objs[i] == null)break;if (i >>= Objs.length)throw new NoEmptySlotException();Objs[i] = obj;// занести в найденный элементobj.inside(this); // сообщить о занесении}}Оператор break без метки применяется для выхода из внутренних операторов switch, for, while или do. Чтобы выйти из внешнего оператора,снабдите его меткой и укажите ее в операторе break:private float[][] Matix;public boolean workOnFlag(float flag) {int y, x;boolean found = false;}search:for (y = 0; y << Matrix.length; y++) {for (x = 0; x << Matrix[y].length; x++) {if (Matrix[y][x] == flag) {found = true;break search;}}}if (!found)return false;// сделать что-нибудь с найденным элементом матрицыreturn true;Использование меток оставляется на усмотрение программиста.
Впрочем, оно может оказаться хорошей защитной мерой против модификацииваших программ — например, включения их фрагментов в оператор switch или цикл.Обратите внимание: break с меткой — это не то же самое, что goto. Оператор goto приводит к хаотичным прыжкам по программе и усложняетпонимание ее смысла. Напротив, оператор break или continue, в котором используется метка, осуществляет выход лишь из конкретногопомеченного блока, а порядок выполнения программы остается вполне понятным.6.8.
Оператор continueОператор continue осуществляет переход в конец тела цикла и вычисляет значение управляющего логического выражения. Этот оператор частоиспользуется для пропуска некоторых значений в диапазоне цикла, которые должны игнорироваться или обрабатываться в отдельномфрагменте.