Поиск…


замечания

Все управляющие структуры, если не указано иное, используют операторы блоков . Они обозначаются фигурными фигурными скобками {} .

Это отличается от обычных утверждений , которые не требуют фигурных скобок, но также имеют жесткую оговорку в том, что будет рассмотрена только строка, непосредственно следующая за предыдущим утверждением.

Таким образом, совершенно правильно написать любую из этих структур управления без фигурных скобок, пока только одно утверждение следует за началом, но оно сильно обескуражено , так как это может привести к ошибкам реализации или сломанному коду.

Пример:

// 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 SE 5

С помощью 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
Java SE 5

Оператор 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;
            
    }
}
Java SE 7

Оператор 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;
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow