Статьи

ОСА Java 7: конструкции if и if-else

Примечание редактора: Этот пост является бесплатной главой из книги Мэннинга «В руководстве по сертификации программиста OCA Java SE 7» Мала Гупты.

В этой статье я расскажу о конструкциях if и if-else. Мы рассмотрим, что происходит, когда эти конструкции используются с фигурными скобками и без них {}. Мы также рассмотрим вложенные конструкции if и if-else.

Конструкция if и ее ароматы

Конструкция if позволяет вам выполнять набор выражений в вашем коде на основе результата условия. Это условие всегда должно принимать логическое или логическое значение. Вы можете указать набор операторов для выполнения, когда это условие оценивается как true или false. (Во многих книгах по Java вы заметите, что термины конструкции и операторы используются взаимозаменяемо.) На рис. 1 показано несколько разновидностей оператора if с их соответствующими представлениями.

  • если                    
  • если еще               
  • если-то еще, если-то еще              

 

Рисунок 1 Несколько вариантов оператора if: if, if-else и if-else-if

На рисунке 1 условие1 и условие2 относятся к переменной или выражению, которое должно принимать логическое или логическое значение. Statement1, Statement2 и Statement3 относятся к одной строке кода или блоку кода. Поскольку булевский класс-оболочка не рассматривается в экзамене на OCA Java SE 7 Programmer, мы не будем рассматривать его здесь. Мы будем работать только с логическим типом данных.

Совет по экзамену: тогда не является ключевым словом в Java и не должно использоваться с оператором if.

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

int score = 100; 
String result = "";
String name = "Lion";
java.io.File file = new java.io.File("F");

На рисунке 2 показано использование конструкций if, if-else и if-else-if-else и сравнение их путем показа кода рядом.

 

Рисунок 2 Многочисленные варианты операторов if, реализованные с использованием кода

Давайте быстро пройдемся по приведенному выше коду, если, if-else и if-else-if-else. В следующем примере кода, если условие name.equals («Lion») оценивается как true, переменной 200 присваивается значение 200:

if (name.equals("Lion"))	#A
   score = 200;		        #A

# Пример конструкции if

В следующем примере, если условие name.equals («Lion») оценивается как true, переменной 200 присваивается значение 200. Если это условие было оценено как ложное, переменной 300 присваивается значение 300:

if (name.equals("Lion"))		#A
     score = 200; 			#A
else					#A
     score = 300;			#A

# Пример конструкции if else

В следующем примере, если оценка равна 100, переменному результату присваивается значение A. Если оценка равна 50, переменному результату присваивается значение B. Если счет равен 10, переменному результату присваивается значение C. Если оценка не соответствует ни 100, ни 50, ни 10, переменной F присваивается значение F. Конструкция if-else-if-else может использовать разные условия для всех своих конструкций if:

if (score == 100)		#A
	result = "A";
else if (score == 50)	        #B
	result = "B";
else if (score == 10)	        #C
	result = "C";
else				#D
     result = "F";

#A Условие 1 -> оценка == 100

#B Условие 2 -> оценка == 50

#C Условие 3 -> оценка == 10

#D Если ни одно из предыдущих условий не имеет значения true, выполнить это еще

На рисунке 3 показан предыдущий код.

 

Рисунок 3 Выполнение кода if-else-if-else

Рисунок 3 проясняет несколько точек:

  • Последний оператор else является частью последней конструкции if, а не какой-либо из конструкций if перед ней.
  • If-else-if-else является конструкцией if-else, где его часть else определяет другую конструкцию if. Некоторые другие языки программирования, такие как VB и C #, используют конструкции if-elsif и if-elseif (без пробела) для определения конструкций if-else-if. Если вы программировали на любом из этих языков, обратите внимание, что разница в отношении Java. Следующий код равен предыдущему коду:
if (score == 100)
	result = "A";
else
	if (score == 50)
		result = "B";
	else
		if (score == 10)
			result = "C";
		else
			result="F";

Опять же, обратите внимание, что ни одна из предыдущих конструкций if не использует затем, чтобы определить код, который будет выполняться, если условие оценивается как true. Как упоминалось ранее, в отличие от других языков программирования, в Java это не ключевое слово и не используется с конструкцией if.

 Совет по экзамену If-else-if-else является конструкцией if-else, где else часть определяет другую конструкцию if.

Логическое выражение, используемое в качестве условия для конструкции if, может также включать операцию присваивания.

Недостающие блоки

Что произойдет, если вы не определите операторы else для конструкции if? Допустимо определить один курс действий для конструкции if следующим образом (пропуская часть else):

boolean testValue = false;
if (testValue == true)				
	System.out.println("value is true");

Но вы не можете определить часть else для конструкции if, пропуская блок кода if. Следующий код не скомпилируется:

boolean testValue = false;
if (testValue == true)				
else                                              #A
	System.out.println("value is false");	

#A Это не скомпилируется

Далее следует еще один интересный и странный фрагмент кода:

int score = 100; 
if((score=score+10) > 110);		#1

# 1 Отсутствует тогда или еще часть

Строка # 1 является допустимой строкой кода, даже если она не определяет и то, и другое, как часть оператора if. В этом случае, если условие оценивает и все. Конструкция if не определяет код, который должен выполняться на основе результата этого условия.

Обратите внимание, что if (testValue == true) совпадает с использованием if (testValue). Аналогично, if (testValue == false) аналогичен использованию if (! TestValue).

Последствия присутствия и отсутствия {} в конструкциях if-else

Вы можете выполнить один оператор или блок операторов, когда условие оценивается как истинное или ложное значение. Блок операторов помечается заключением одного или нескольких операторов в пару фигурных скобок ({}). Изучите следующий код:

String name = "Lion";
int score = 100;
if (name.equals("Lion"))  
	score = 200;

Что произойдет, если вы захотите выполнить еще одну строку кода, если значение имени переменной равно Lion? Правильный ли следующий код?

String name = "Lion";
int score = 100;
if (name.equals("Lion"))
	score = 200;
	name = "Larry";		#1

# 1 Установите имя Ларри

Совет по экзамену На экзамене следите за кодом, похожим на вышеупомянутую конструкцию if, которая использует вводящее в заблуждение отступ. В отсутствие определения блока кода (отмеченного парой {}), только часть, следующая за конструкцией if, формирует его часть.

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

String name = "Lion";
int score = 100;
if (name.equals("Lion"))
	score = 200;
	name = "Larry";	#A
else				
	score = 129;

#A Это утверждение не является частью конструкции if

В этом случае предыдущий код не будет компилироваться. Компилятор сообщит, что часть else определена без оператора if. Если это оставляет вас в замешательстве, изучите следующий код с отступом, чтобы подчеркнуть тот факт, что строка name = «Larry» не является частью конструкции else:

String name = "Lion";
int score = 100;
if (name.equals ("Lion"))
	score = 200;

name = "Larry";		#A 

else				#B
	score = 129;

# Правильный отступ, чтобы подчеркнуть, что это утверждение не является частью конструкции if

#B остальное определено без предшествующей конструкции if

Если вы хотите выполнить несколько операторов для конструкции if, вы должны определить их в блоке кода. Вы можете сделать это, определив весь этот код в фигурных скобках ({}). Чтобы следовать это пример:

String name = "Lion";
int score = 100;
if (name.equals("Lion")) {   #A 
	score = 200;		   #B
	name = "Larry";	   #B
}                             #C
else				
	score = 129;

#A Начало блока кода

#B Заявления для выполнения, если (name.equals («Lion»)) имеет значение true

#C Конец блока кода

Точно так же вы можете определить несколько строк кода для остальной части (неправильно) следующим образом:

String name = "Lion";
if (name.equals("Lion"))
	System.out.println("Lion");
else
	System.out.println("Not a Lion");
	System.out.println("Again, not a Lion");        #1

# 1 Не является частью другой конструкции. Выполняется независимо от значения имени переменной

Вывод приведенного выше кода выглядит следующим образом:

Lion
Again, not a Lion

Хотя кажется, что код в строке # 1 выполняется только в том случае, если значение имени переменной совпадает со значением Lion, это не так. Он неправильно написан, чтобы заставить вас поверить, что он является частью блока else. Приведенный выше код аналогичен следующему коду (с правильным отступом):

String name = "Lion";
if (name.equals("Lion"))
	System.out.println("Lion");
else
	System.out.println("Not a Lion");
System.out.println("Again, not a Lion");        #1

# 1 Не является частью другой конструкции. Выполняется независимо от значения имени переменной

Если вы хотите выполнить последние два оператора в предыдущем коде, только если условие if оценивается как ложное, вы можете сделать это с помощью {}:

String name = "Lion";
if (name.equals("Lion"))
	System.out.println("Lion");
else {
	System.out.println("Not a Lion");
	System.out.println("Again, not a Lion");        #1
   }

# 1 Теперь часть конструкции else. Выполняется только тогда, когда условие оценивается как ложное

Вы можете определить другой оператор, конструкцию или цикл для выполнения условия if без использования {} следующим образом:

String name = "Lion";
if (name.equals("Lion"))                 #A
	for (int i = 0; i < 3; ++i)          #B
		System.out.println(i);      #C

#A если условие

Цикл #B for является единственной конструкцией, которая будет выполняться, если name.equals («Lion») оценивается как true

#C Этот код является частью цикла for, определенного в предыдущей строке

System.out.println (i) является частью цикла for, а не несвязанным оператором, который следует за циклом for. Таким образом, этот код является правильным и дает следующий вывод:

0
1
2

Соответствующие и неуместные выражения, передаваемые в качестве аргументов в оператор if

Результат выражения, используемого в конструкции if, должен принимать логическое или логическое значение. Дано следующее определение переменных:

int score = 100;
boolean allow = false;
String name = "Lion"; 

Далее приведены примеры некоторых допустимых выражений, которые можно передать конструкции if. Обратите внимание, что использование == не является хорошей практикой для сравнения двух объектов String на равенство. Правильный способ сравнить два объекта String — использовать метод equals из класса String. Однако сравнение двух значений String с использованием == является допустимым выражением, которое возвращает логическое значение и может также использоваться в экзамене:

(score == 100)	    #A
(name == "Lio")	    #B
(score <= 100 || allow) #C
(allow)		    #D

#A оценивает как истинное

#B оценивает как ложное

#C оценивает как истинное

#D оценивает как ложное

Теперь начинается сложная часть передачи операции присваивания конструкции if. Как вы думаете, что является выводом следующего кода?

boolean allow = false;
if (allow = true)                           #A
	System.out.println("value is true");
else
	System.out.println("value is false");

#A Это задание, а не сравнение

Вы можете подумать, что поскольку значение логической переменной allow установлено равным false, предыдущее значение вывода кода равно false. Пересмотрите код и обратите внимание, что операция присваивания allow = true присваивает значение true логической переменной allow. Кроме того, его результат также является логическим значением, что делает его пригодным для передачи в качестве аргумента конструкции if,

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

boolean allow = false;
if (allow == true)				#A
	System.out.println("value is true");
else
	System.out.println("value is false");

#A Это сравнение

Совет по экзамену Следите за кодом на экзамене, который использует оператор присваивания (=) для сравнения логического значения в условии if. Это не будет сравнивать логическое значение; это присвоит ему значение. Правильный оператор для сравнения логического значения — это оператор равенства (==).

Вложенный, если конструкции

Вложенная конструкция if является конструкцией if, определенной в другой конструкции if. Теоретически у вас нет ограничений на уровни вложенных конструкций if и if-else. Всякий раз, когда вы сталкиваетесь с вложенными конструкциями if и if-else, вы должны быть осторожны при определении части else оператора if. Если это утверждение не имеет большого смысла, взгляните на следующий код и определите его вывод:

int score = 110;
if (score > 200)		#1
	if (score <400)	#2
		if (score > 300)
			System.out.println(1);
		else
			System.out.println(2);
else					             #3
	System.out.println(3);                     #3

# 1 if (оценка> 200)

# 2 if (оценка <400)

# 3 К чему, если это еще принадлежит?

Основываясь на способе отступа кода, вы можете полагать, что остальное в # 3 относится к if, определенному в # 1. Но это относится к если определено на # 2. Чтобы следовать это код с правильным отступом:

int score = 110;
if (score > 200)		
	if (score <400)	
		if (score > 300)
			System.out.println(1);
		else
			System.out.println(2);
else					#A
		System.out.println(3);	#A

#A Это еще относится к условию if (оценка <400)

Далее вам необходимо понять, как сделать следующее:

  • Как определить else для внешнего if, отличного от того, которому он будет назначен по умолчанию
  • Как определить, к чему, если принадлежит else, во вложенных конструкциях if

Обе эти задачи просты. Давайте начнем с первого.

Как определить else для внешнего, если он не тот, которому он будет назначен по умолчанию

Ключевым моментом является использование фигурных скобок следующим образом:

int score = 110;
if (score > 200) {		#1
	if (score <400)		
		if (score > 300)
			System.out.println(1);
		else
			System.out.println(2);
}					#2
else					#3
	System.out.println(3);	#3

# 1 Начните, если построить для оценки> 200

# 2 Конец, если конструкция для оценки> 200

№ 3 еще за счет> 200

Фигурные скобки в № 1 и № 2 отмечают начало и конец условия if (оценка> 200), определенного в № 1. Следовательно, else в # 3, который следует за # 2, принадлежит if, определенному в # 1.

Как определить, к какому объекту относится принадлежность к вложенным конструкциям if?

Если код использует фигурные скобки для обозначения начала и конца территории конструкции if или else, это может быть просто, как упоминалось в предыдущем разделе: «Как определить else для внешнего if, отличного от того, который будет назначаться по умолчанию. » Когда конструкции if не используют фигурные скобки, не смущайтесь отступы кода. Попробуйте сопоставить все, если с соответствующими им в следующем плохо отступом кода:

if (score > 200)
if (score <400) 
if (score > 300)
	System.out.println(1);
else
	System.out.println(2);
else
	System.out.println(3);

Начните работать наизнанку с самым внутренним оператором if-else, сопоставляя else с ближайшим непревзойденным оператором if. На рисунке 4 показано, как сопоставить пары if-else для предыдущего кода, отмеченные 1, 2 и 3.

 

Рисунок 4 Сопоставление пар if-else для кода с плохим отступом

Резюме

We covered the different flavors of the if construct. You saw what happens when these constructs are used with and without curly braces {}. We also covered nested if and if-else constructs. The humble if-else construct can virtually define any set of simple or complicated conditions.

 

OCA Java SE 7 Programmer I Certification Guide

By Mala Gupta

In the OCA Java SE 7 programmer exam, you’ll be asked you’ll be asked how to define and control the flow in your code. In this article, based on chapter 4 of OCA Java SE 7 Programmer I Certification Guide, author Mala Gupta How show you to use if, if-else, if-else-if-else and nested if constructs and the difference when these if constructs are used with and without curly braces {}.

Here are some other Manning titles you might be interested in:

Unit Testing in Java

Lasse Koskela

Making Java Groovy

Kenneth Kousen

Play for Java

Nicolas Leroux and Sietse de Kaper