Java Language
Основные управляющие структуры
Поиск…
замечания
Все управляющие структуры, если не указано иное, используют операторы блоков . Они обозначаются фигурными фигурными скобками {}
.
Это отличается от обычных утверждений , которые не требуют фигурных скобок, но также имеют жесткую оговорку в том, что будет рассмотрена только строка, непосредственно следующая за предыдущим утверждением.
Таким образом, совершенно правильно написать любую из этих структур управления без фигурных скобок, пока только одно утверждение следует за началом, но оно сильно обескуражено , так как это может привести к ошибкам реализации или сломанному коду.
Пример:
// valid, but discouraged
Scanner scan = new Scanner(System.in);
int val = scan.nextInt();
if(val % 2 == 0)
System.out.println("Val was even!");
// invalid; will not compile
// note the misleading indentation here
for(int i = 0; i < 10; i++)
System.out.println(i);
System.out.println("i is currently: " + i);
Если / Else If / Else Control
if (i < 2) {
System.out.println("i is less than 2");
} else if (i > 2) {
System.out.println("i is more than 2");
} else {
System.out.println("i is not less than 2, and not more than 2");
}
Блок if
будет работать только тогда, когда i
равно 1 или меньше.
Условие else if
проверяется только в том случае, если все условия перед ним (в предыдущем, else if
конструкторы и родительские, if
конструкции) были проверены на false
. В этом примере условие else if
будет проверяться только в том случае, если i
больше или равно 2.
Если его результат true
, его блок запускается, а любое else if
и else
конструируется после того, как оно будет пропущено.
Если ни одно из условий if
и else if
не было проверено на true
, блок else
в конце будет запущен.
Для циклов
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
Эти три составляющих for
цикла (разделенного ;
) являются описанием переменных / инициализации (здесь int i = 0
), то условие (здесь i < 100
), а инкремент утверждение (здесь i++
). Объявление переменной выполняется один раз, как если бы оно помещалось только внутри {
при первом запуске. Затем условие проверяется, если оно true
тело цикла будет выполняться, если оно false
цикл остановится. Предполагая, что цикл продолжается, тело выполнится, и, наконец, когда будет достигнуто значение }
оператор инкремента будет выполняться непосредственно перед повторным проверкой условия.
Фигурные фигурные скобки необязательны (вы можете использовать одну строку с точкой с запятой), если цикл содержит только одно утверждение. Но всегда рекомендуется использовать фигурные скобки, чтобы избежать недоразумений и ошибок.
Компоненты цикла for
являются необязательными. Если ваша бизнес-логика содержит одну из этих частей, вы можете опустить соответствующий компонент из цикла for
.
int i = obj.getLastestValue(); // i value is fetched from a method
for (; i < 100; i++) { // here initialization is not done
System.out.println(i);
}
Структура for (;;) { function-body }
равна циклу while (true)
.
Nested For Loops
Любой оператор цикла, имеющий другой оператор цикла внутри вложенного цикла. То же самое и для цикла с большим внутренним циклом называется «вложенным для цикла».
for(;;){
//Outer Loop Statements
for(;;){
//Inner Loop Statements
}
//Outer Loop Statements
}
Вложенные для цикла могут быть продемонстрированы для печати чисел в форме треугольника.
for(int i=9;i>0;i--){//Outer Loop
System.out.println();
for(int k=i;k>0;k--){//Inner Loop -1
System.out.print(" ");
}
for(int j=i;j<=9;j++){//Inner Loop -2
System.out.print(" "+j);
}
}
В то время как петли
int i = 0;
while (i < 100) { // condition gets checked BEFORE the loop body executes
System.out.println(i);
i++;
}
В while
цикл выполняется до тех пор , пока условие внутри скобок true
. Это также называется структурой «pre-test loop», потому что условный оператор должен выполняться до того, как тело основного цикла будет выполняться каждый раз.
Кудрявые фигурные скобки необязательны, если цикл содержит только одно утверждение, но некоторые правила стиля кодирования предпочитают иметь скобки независимо.
do ... while Loop
Цикл do...while
while отличается от других циклов тем, что он гарантированно выполняется хотя бы один раз . Он также называется структурой «посттест-цикл», потому что условный оператор выполняется после основного тела цикла.
int i = 0;
do {
i++;
System.out.println(i);
} while (i < 100); // Condition gets checked AFTER the content of the loop executes.
В этом примере цикл будет выполняться до тех пор, пока не будет напечатано число 100
(хотя условие равно i < 100
а не i <= 100
), поскольку условие цикла оценивается после выполнения цикла.
С гарантией хотя бы одного выполнения можно объявить переменные за пределами цикла и инициализировать их внутри.
String theWord;
Scanner scan = new Scanner(System.in);
do {
theWord = scan.nextLine();
} while (!theWord.equals("Bird"));
System.out.println(theWord);
В этом контексте theWord
определяется вне цикла, но поскольку он гарантированно имеет значение, основанное на его естественном потоке, theWord
будет инициализирован.
Для каждого
С помощью Java 5 и выше можно использовать для каждого цикла, также известные как расширенные для циклов:
List strings = new ArrayList();
strings.add("This");
strings.add("is");
strings.add("a for-each loop");
for (String string : strings) {
System.out.println(string);
}
Для каждой петли можно использовать для итерации по массивам и реализации интерфейса Iterable
, а позднее - классы Collections , такие как List
или Set
.
Переменная цикла может быть любого типа, которая может быть назначена из типа источника.
Переменная цикла для расширенного цикла для Iterable<T>
или T[]
может быть типа S
, если
-
T extends S
- как
T
иS
являются примитивными типами и присваиваются без литья -
S
является примитивным типом, иT
может быть преобразован в тип, назначаемыйS
после преобразования с помощью распаковки. -
T
является примитивным типом и может быть преобразован вS
путем преобразования с помощью автоматического преобразования.
Примеры:
T elements = ...
for (S s : elements) {
}
T | S | Собирает |
---|---|---|
ИНТ [] | долго | да |
долго[] | ИНТ | нет |
Iterable<Byte> | долго | да |
Iterable<String> | CharSequence | да |
Iterable<CharSequence> | строка | нет |
ИНТ [] | Долго | нет |
ИНТ [] | целое число | да |
Если еще
int i = 2;
if (i < 2) {
System.out.println("i is less than 2");
} else {
System.out.println("i is greater than 2");
}
Оператор if
выполняет код условно в зависимости от результата условия в круглых скобках. Когда условие в скобках истинно, оно будет вводиться в блок оператора if, который определяется фигурными фигурными скобками типа {
и }
. открывающий кронштейн до закрытия скобки - это объем инструкции if.
Блок else
является необязательным и может быть опущен. Он работает, если оператор if
является false
и не запускается, if
оператор if
истинен, потому что в этом случае выполняется оператор if
.
См. Также: Тернар Если
Оператор switch
Оператор switch
представляет собой многопроцессорную инструкцию Java. Он используется для замены длинных цепочек if
else if
else
и делает их более читаемыми. Однако, в отличие от , if
это заявления, один может не использовать неравенство; каждое значение должно быть конкретно определено.
В оператор switch
есть три важных компонента:
-
case
: Это значение, которое оценивается для эквивалентности с аргументом инструкцииswitch
. -
default
: Это необязательное выражение catch-all, если ни одно из операторовcase
равноtrue
. - Резкое завершение заявления
case
; обычноbreak
: это необходимо для предотвращения нежелательной оценки дальнейших заявленийcase
.
За исключением continue
, можно использовать любой оператор, который может вызвать резкое завершение инструкции . Это включает:
-
break
-
return
-
throw
В приведенном ниже примере типичный оператор switch
записывается с четырьмя возможными случаями, включая default
.
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
switch (i) {
case 0:
System.out.println("i is zero");
break;
case 1:
System.out.println("i is one");
break;
case 2:
System.out.println("i is two");
break;
default:
System.out.println("i is less than zero or greater than two");
}
Путем пропадания break
или любого заявления, которое было бы внезапным завершением, мы можем использовать так называемые «провальные» случаи, которые оцениваются по нескольким значениям. Это можно использовать для создания диапазонов для того, чтобы значение было успешным против, но оно по-прежнему не столь гибко, как неравенство.
Scanner scan = new Scanner(System.in);
int foo = scan.nextInt();
switch(foo) {
case 1:
System.out.println("I'm equal or greater than one");
case 2:
case 3:
System.out.println("I'm one, two, or three");
break;
default:
System.out.println("I'm not either one, two, or three");
}
В случае foo == 1
выход будет:
I'm equal or greater than one
I'm one, two, or three
В случае foo == 3
вывод будет:
I'm one, two, or three
Оператор switch также может использоваться с enum
.
enum Option {
BLUE_PILL,
RED_PILL
}
public void takeOne(Option option) {
switch(option) {
case BLUE_PILL:
System.out.println("Story ends, wake up, believe whatever you want.");
break;
case RED_PILL:
System.out.println("I show you how deep the rabbit hole goes.");
break;
}
}
Оператор switch
также может использоваться с String
s.
public void rhymingGame(String phrase) {
switch (phrase) {
case "apples and pears":
System.out.println("Stairs");
break;
case "lorry":
System.out.println("truck");
break;
default:
System.out.println("Don't know any more");
}
}
Тернарный оператор
Иногда вам нужно проверить условие и установить значение переменной.
Напр.
String name;
if (A > B) {
name = "Billy";
} else {
name = "Jimmy";
}
Это можно легко записать в одной строке, так как
String name = A > B ? "Billy" : "Jimmy";
Значение переменной устанавливается в значение сразу после условия, если условие истинно. Если условие ложно, второе значение будет присвоено переменной.
Перерыв
Оператор break
заканчивает цикл (например, for
, while
) или оценку оператора switch .
Loop:
while(true) {
if(someCondition == 5) {
break;
}
}
Цикл в примере будет работать вечно. Но когда someCondition
равно 5
в какой-то момент исполнения, цикл заканчивается.
Если несколько циклов каскадируются, только самый внутренний цикл заканчивается использованием break
.
Попробуйте ... Поймать ... Наконец
Для обработки Исключений используется структура управления try { ... } catch ( ... ) { ... }
.
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
}
Это напечатает:
Неправильный ввод. «abc» не является допустимым целым числом.
После catch
можно добавить предложение finally
. Предложение finally
всегда будет выполняться независимо от того, было ли исключено исключение.
try { ... } catch ( ... ) { ... } finally { ... }
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
} finally {
System.out.println("This code will always be run, even if an exception is thrown");
}
Это напечатает:
Неправильный ввод. «abc» не является допустимым целым числом.
Этот код всегда будет запущен, даже если исключено исключение
Вложенный разрыв / продолжение
Можно break
/ continue
внешний цикл с помощью операторов ярлыков:
outerloop:
for(...) {
innerloop:
for(...) {
if(condition1)
break outerloop;
if(condition2)
continue innerloop; // equivalent to: continue;
}
}
Другого использования для ярлыков в Java нет.
Продолжить вывод в Java
Оператор continue используется, чтобы пропустить оставшиеся шаги в текущей итерации и начать с следующей итерации цикла. Элемент управления переходит из инструкции continue
к значению шага (приращение или декремент), если таковые имеются.
String[] programmers = {"Adrian", "Paul", "John", "Harry"};
//john is not printed out
for (String name : programmers) {
if (name.equals("John"))
continue;
System.out.println(name);
}
Оператор continue
также может управлять переключением программы на значение шага (если оно есть) именованного цикла:
Outer: // The name of the outermost loop is kept here as 'Outer'
for(int i = 0; i < 5; )
{
for(int j = 0; j < 5; j++)
{
continue Outer;
}
}