Java Управляющие операторы

Рассмотрев "обычные" операторы, перейдём к управляющим.

IF (условный оператор)

Условный операторы if, применяется для построение логического ветвления (две ветки) пути выполнения программы - отслеживает логическое значение выражения заключённого в скобки:

if (value != null) { // проверяется истинность выражения
    ... // если истинно то можно выполнить ряд операций
} else { // если ложно
   
    if (map.containsKey(key)) { // некоторое вложенное условие
       // здесь опять какие -то операции, например:
       int a = 1; // просто для иллюстрации
    } else { // если вложенное условие не выполнилось
       // здесь опять можно что-то сделать
    }
}

SWITCH (оператор ветвления)

Оператор ветвления позволяет создать сколько угодно ветвей для одного выражения, имеет следующую структру:

int month = 8;
        String monthString;
        switch (month) { // switch можно вкладывать один в другой (как и if)
            case 1:  monthString = "January";
                     break; // необходим чтобы выполнение не продолжилось
// но при этом  break не является обязательным в  switch
            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) если ,например  month == 15
// то есть в случае когда значения нет среди вариантов case;
            default: monthString = "Invalid month"; // действие "по умолчанию"
                     break;
// default не обязателен в  switch
        }
        System.out.println(monthString);
// напечатает  "Август" - т.к. это иесть восьмой месяц

Цикл while

Цикл while продолжает "повторять" своё тело до тех пор, пока проверочное выражение в скобках истинно, например:

int i=0;
int len = data.length; // получаем некоторое значение
while (i< len) // пока == true
{
   // здесь какие-нибудь операции
  i++; наращиваем счётчик, если не хотим "зацикливания"
}

Цикл do-while

Иногда такого рода цикл называют циклом с "постусловием" - принципиальное отличие от предыдущего варианта в том, что в случае, если условие ложно - цикл всё-таки выполнится один раз (до первой проверки) - иногда такое свойство оказывается полезным.
Пример:

int i=0;
int len = 7; // получаем некоторое значение
do { // начало цикла
   // здесь какие-нибудь операции
  i++; наращиваем счётчик, если не хотим "зацикливания"
} while (i< len) // проверка после итерации

Цикл for

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

Мы уже сталкивались с этим циклом (правда, не обсуждая подробностей его работы) когда изучали массивы, оттуда я и возьму пример где будут сразу два цикла - один вложен в другой:

 
        	int raz1 = 5; 
        	int raz2 = 4;
             // Создаем двумерный массив 
        	// именно его мы и будем "обходить" в циклах ниже
             char[][] arr = new char[raz1][raz2];
       
             // Цикл по "строкам"
             for ( // внешний цикл
            		 int i = 0; // начальное значение счётчика 
            		 i < raz1; // условие продолежния ("пока выполнено...")
            		 i++ // способ изменения счётика
            		 ) {
                 // Цикл по "столбцам"
            	 // обычно "голова" цикла записывается в одну строку - 
            	 // выше мы разделили её на три для удобства комментирования
                 for (int j = 0; j < raz2; j++) { // внутренний цикл
                     arr[i][j] = '#';
                      
                     // выводим через пробел
                     System.out.print( arr[i][j] + " "); 
                 }
                 System.out.print('\n'); // переносим строчку
             }

Как показано в последнем примере, "голова" цикла делится на три блока - при этому инициалиационная (первая, где устанавливается начальное значение счётчика) часть и итерационная в общем случаем могут включать несколько операций которые можно разделять запятой.
Например цикл:

int a,b;
b = 8;
for (a = 1; a <= b;  a+=2){
   // тело цикла
   b++; // инкремент
} 

можно переписать так (передвинем некоторые операции в "голову"):

int a,b;

for (a = 1, b = 8; a <= b;  a+=2, b++){
   // тело цикла
} 

Более того - не обязательно привязывать условие выхода из цикла for к значению счётчика явным образом,
например можно написать так:

int a,b;
boolean f = false;
for (a = 1, b = 8; !f;  a+=2, b++){
  if   (a > b) 
        f = true; // теперь цикл завершиться
  // тело цикла (остальные операторы)
} 
// число итераций совпадает с предыдущим примером

for-each версия цикла for

Эта продвинутая версия цикла используется для неявного получения очередного значения коллекции в переменную необходимого типа.
Например такой цикл:

        	char[] ch = {'a', 'b', 'c'};
        	for (int i = 0; i < 3; i++)
        		System.out.print( ch[i] + " ");
        	// можно обойти коллекцию (в данном случае - это массив)
        	//и более простым и одновременно "продвинутым" способом:
        	for (char charsymb : ch)
        		System.out.print( charsymb + " ");
        	// в charsymb попадает очередное значение массива

Оператор break

Оператор break, используется для прерывания выполнения программы на уровне блока - выше мы рассмотрели его использование в switch, также break может быть использован для выхода из цикла.

Но также оператор может быть использован и для так называемого "безусловного" перехода, например:

        	boolean t = true;
        	// далее "искусстсвенно" создаются три блока 
        	// (вложенных), каждый из которых помечается меткой
        	first: {
	        	second: {
		        	third: { // самый "младший" блок
			        	System.out.println("Предшествует оператору break.");
			        	
			        	if(t) break second; // выход из блока second
			        	System.out.println("Этот оператор не будет выполняться");
			        }
			       
        			System.out.println("Этот оператор не будет выполняться");
			    }
		        
        		System.out.println("Этот оператор следует за блоком second.");
        	}
        	/*после выполнения получим текст:
        	  
        	  Предшествует оператору break.
        	  Этот оператор следует за блоком second.*/
        	

Безусловный переход позволяет быстро выйти, например из цикла, на необходимый уровень вложенности, не загромождая код условными операторами.

Если необходимо применить метку к блоку цикла, то она ставиться точно также слева (как и в последнем пример), а именно:

 first: for ( int i = 0; i < raz1;  i++ ) { // цикл с меткой
        inner:   for (int j = 0; j < raz2; j++) { // внутренний цикл c меткой
             // тут тело вложенного цикла
               if (i >= 2) break first; // выходим из обоих циклов
             }
}

Оператор continue

Позволяет продолжить выполнение "прокинув" текущую итерацию ("виток цикла") целиком или частично (в зависимости от точки вызова), может быть использован без метки -тогда просто останавливается текущий виток для текущего блока цикла и начинается следующий.

Также возможно использование с меткой:

 first: for ( int i = 0; i < raz1;  i++ ) { // цикл с меткой
        inner:   for (int j = 0; j < raz2; j++) { // внутренний цикл c меткой
             // тут тело вложенного цикла
               if (i >= 2) continue first; // пробросим все операции  
// где  i больше либо равно двум
             }
}

Оператор return

Используется для выполнения явного выхода из метода - управление передаётся тому коду, который вызвал данный метод.
Подробнее мы рассмотрим этот оператор, когда будем говорить о классах, но уже сейчас полезно понимать, что после его вызова выполнением метода полностью и "безусловно" прекращается, пример:

public class Test {
        public static void main(String[] args) {   	
        	boolean t = true;

        	first: {
	        	second: {
		        	third: { // самый "младший" блок
			        	System.out.println("До RETURN (после уже ничего не будет)))");
			        	
			        	if(t) return; // НИЧТО после не выполнится!
			        	System.out.println(" не будет выполняться");
			        }
			       
        			System.out.println(" не будет выполняться");
			    }
		        
        		System.out.println(" не выполнится.");
        	}
        	/*после выполнения получим текст:
        	  
        	  До RETURN (после уже ничего не будет)))*/
        }
    }
 

На этом мы заканчиваем рассмотрение управляющих оператором и движемся дальше =)