Java if statements
The Java if statement enables your Java programs to make decisions about what code to execute depending on the state of variables, or values returned from methods. Here is a simple Java if example:
boolean isValid = true; if ( isValid ) < System.out.println("it is valid"); >else
The if statement in this example tests the boolean variable isValid and based on its value (either true or false ) it executes one of two different blocks of code. If the isValid variable has the value of true , the first block is executed. If not, the code inside the else block is executed.
The expression inside the parentheses is called the condition. The condition can be any Java expression, as long as the result of the expression is a boolean result (either true or false ).
In the example above, the condition was whether the isValid variable was true or false.
If the block of code to be executed is just a single statement, you do not need the brackets < >around them, in the if statements. Here is an example:
if ( isValid ) System.out.println("it is valid"); else System.out.println("it is not valid");
However, it is good practice to put the brackets around the statements, even if there is only one statement to execute. Often during development you may start with a single statement that needs to be executed inside an if or else block, but later have to add more statements to the blocks. This can lead to errors that are hard to spot. Look at this if statement:
if( isValid) System.out.println("it is valid");
Now imagine I have to increment a valid counter if isValid is true . Naively I might change the code to this:
if( isValid) validCount++; System.out.println("it is valid");
But now only the validCount++ statement belongs to the if statement. The System.out.println() statement will always be executed. Or, imagine if I had switched the statements like this:
if( isValid) System.out.println("it is valid"); validCount++;
Now only the System.out.println() statement belongs to the if statement. The validCount++ statement will always be executed.
To avoid this error I almost always put the brackets around the blocks to execute, even if there is only one statement to execute in the block. Here is how that could look:
When the brackets are there, it is easier to remember to insert new statements inside the brackets.
Conditional Operators
Java has a set of conditional operators you can use, which result in a value of either true or false . These are:
The == operator tests if two values are equal to each other. For instance:
long var1 = 2; long var2 = 5; if(var1 == var2) < //. >
If the two variables, var1 and var2 , are equal, the expression var1 == var2 is evaluated to true . Otherwise the expression is evaluated to false .
The != operator does the exact opposite of the == operator. If the two variables are not equal, the expression is evaluated to true . If the two variables are equal, the expression is evaluated to false .
The >= operator works like the > operator except it also evaluates to true if the two variables are equal to each other.
Comparing Variables and Constants
In the examples earlier in this text I have only shown comparisons of either constants to constants, or variables to variables. But, you can also compare constants to variables. Here are two examples:
int var1 = 50; if(var1 > 10) < //. >if(99
Methods as Conditions
You can also use the return value of a method as condition in an if statement. Here is how:
public void methodOne (String input) < if ( isValid(input) ) < System.out.println(input + " is valid"); >else < System.out.println(input + " is not valid"); >> public boolean isValid(String value) < if( value.equals("123") ) < return true; >return false; >
This example actually contains two if statements with methods as conditions. First the
which tests the output of the isValid(input) method, for a true or false result.
Second, inside the isValid() method the String.equals() method is used to test for equality to a certain string value. This is the if statement that tests it:
The isValid() method could actually have been written in a shorter way. Here is how:
public boolean isValid(String value)
Now the isValid() method returns the value returned by the value.equals() method call.
You could also switch the string «123» and value variable in the statement, like this:
public boolean isValid(String value)
This version actually has the advantage, that if value is null (does not point to a String object, but to nothing), this version will not result in a NullPointerException .
Chaining if Statements
It is possible to chain if statements, to create a decision tree. Here is an example:
if( name.equals("john")) < //. >else if ( name.equals("jane")) < //. >else if ( name.equals("Linda")) < //. >else < //. >
In the example above, else if statements are chained, one after another. Actually, this chained if statement is just an if statement executed in an else block, without the brackets < >, as I showed you that you can, in the beginning of this text. The above code is actually equivalent to this:
if( name.equals("john")) < //. >else < if ( name.equals("jane")) < //. >else < if ( name.equals("Linda")) < //. >else < //. >> >
As you can see, the first version is actually easier to read. This is the one exception I normally have to the rule of always embedding the statements of the if and else inside brackets. In this case I prefer the first version. It is easier to read, write, and does not often result in programming errors.
Ветвление в Java
В данной статье мы рассмотрим такое понятие как ветвление в компьютерных программах в общем и написанных на ЯП Java. Поговорим о таких управляющих конструкциях, как:
- if-then (или же if )
- if-then-else (или же if-else )
- switch-case
Ветвление
if-then
Оператор if-then , или же просто if пожалуй самый распространенный оператор. Выражение “да там 1 if написать” уже стало крылатым. Оператор if имеет следующую конструкцию:
- bool_condition — boolean выражение, результатом которого является true или false. Данное выражение называют условием.
- statement — команда (может быть не одна), которую необходимо исполнить, в случае, если условие истинно ( bool_statement==true )
public static void main(String[] args) < Scanner scanner = new Scanner(System.in); System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?"); int a = scanner.nextInt(); if (a < 10) < System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству"); >>
В данной программе пользователю предлагается ввести количество процентов заряда батареи на его смартфоне. В случае, если осталось менее 10 процентов заряда, программа предупредит пользователя о необходимости зарядить смартфон. Это пример простейшей конструкции if . Стоит заметить, что если переменная `а` будет больше либо равна 10, то ничего не произойдет. Программа продолжит выполнять код, который следует за конструкцией if . Также заметим, что в данном случае, у конструкции if есть только одна последовательность действий для исполнения: напечатать текст, либо не делать ничего. Эта вариация ветвления с одной “ветвью”. Такое порой бывает необходимо. Например когда мы хотим обезопасить себя от неправильных значений. К примеру, мы не можем узнать количество букв в строке, если строка равна null . Примеры ниже:
public static void main(String[] args) < String x = null; printStringSize(x); printStringSize("Не представляю своей жизни без ветвлений. "); printStringSize(null); printStringSize("Ифы это так захватывающе!"); >static void printStringSize(String string) < if (string != null) < System.out.println("Кол-во символов в строке `" + string + "` lang-java line-numbers"> if (bool_condition) < statement1 >else
- bool_statement — boolean выражение, результатом которого является true или false. Данное выражение называют условием.
- statement1 — команда (может быть не одна), которую необходимо выполнить, если условие истинно ( bool_statement==true )
- statement2 — команда (может быть не одна), которую необходимо выполнить, если условие ложно ( bool_statement==false )
Если (bool_condition), то Иначе
public static void main(String[] args) < Scanner scanner = new Scanner(System.in); System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?"); int a = scanner.nextInt(); if (a < 10) < System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству"); >else < System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush"); >>
Тот же пример об уровне заряда батареи на смартфоне. Только если в прошлый раз программа только лишь предупреждала о необходимости зарядить смартфон, то в этот раз у нас появляется дополнительное уведомление. Разберем этот if :
Если a < 10 истинно (уровень заряда батареи меньше 10), программа выведет на печать один текст. Иначе, если условие a < 10 не выполняется, то программа выведет уже совсем другой текст. Доработаем также и второй наш пример, в котором мы выводили на экран количество букв в строке. В прошлый раз программа не выводила ничего, если переданная строка была равна null . Исправим этом, превратив обычный if в if-else :
public static void main(String[] args) < String x = null; printStringSize(x); printStringSize("Не представляю своей жизни без ветвлений. "); printStringSize(null); printStringSize("Ифы это так захватывающе!"); >static void printStringSize(String string) < if (string != null) < System.out.println("Кол-во символов в строке `" + string + "`=" + string.length()); >else < System.out.println("Ошибка! Переданная строка равна null!"); >>
В методе printStringSize в конструкцию if мы добавили блок else . Теперь, если мы запустим программу, она выведет в консоль уже не 2 строки, а 4, хотя вводные (метод main ) остались такими же, как и в прошлый раз. Текст, который выведет программа:
Ошибка! Переданная строка равна null! Кол-во символов в строке `Не представляю своей жизни без ветвлений. `=43 Ошибка! Переданная строка равна null! Кол-во символов в строке `Ифы это так захватывающе!`=25
Допустимы ситуации, когда после else следуют не команды на исполнение, а еще один if . Тогда конструкция принимает следующий вид:
If (bool_condition1) < statement1 >else if (bool_condition2) < statement2 >else if (bool_conditionN) < statementN >else
- bool_condition1
- bool_condition2
- bool_conditionN
- statement1
- statement2
- statementN
Если (bool_condition1) то Иначе если (bool_condition2) то Иначе если (bool_conditionN) то Иначе
Последняя строка в данном случае опциональна. Можно обойтись и без последнего одинокого else . И тогда конструкция примет следующий вид:
If (bool_condition1) < statement1 >else if (bool_condition2) < statement2 >else if (bool_conditionN)
Если (bool_condition1) то Иначе если (bool_condition2) то Иначе если (bool_conditionN) то
Соответственно, в случае, если ни одно из условий не окажется истинным, то ни одна команда не будет исполнена. Перейдем к примерам. Вернемся к ситуации с уровнем заряда на смартфоне. Напишем программу, которая будет более детально информировать владельца об уровне заряда его девайса:
public static void main(String[] args) < String alert5 = "Я скоро отключусь, но помни меня бодрым"; String alert10 = "Я так скучаю по напряжению в моих жилах"; String alert20 = "Пора вспоминать, где лежит зарядка"; String alert30 = "Псс, пришло время экономить"; String alert50 = "Хм, больше половины израсходовали"; String alert75 = "Всё в порядке, заряда больше половины"; String alert100 = "Я готов к приключениям, если что.."; String illegalValue = "Такс, кто-то ввел некорректное значение"; Scanner scanner = new Scanner(System.in); System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?"); int a = scanner.nextInt(); if (a 100) < System.out.println(illegalValue); >else if (a < 5) < System.out.println(alert5); >else if (a < 10) < System.out.println(alert10); >else if (a < 20) < System.out.println(alert20); >else if (a < 30) < System.out.println(alert30); >else if (a < 50) < System.out.println(alert50); >else if (a < 75) < System.out.println(alert75); >else if (a >
К примеру в данном случае, если пользователь введет 15, то программа выведет на экран: “Пора вспоминать, где лежит зарядка”. Несмотря на то, что 15 меньше и 30 и 50 и 75 и 100, вывод на экран будет только 1. Напишем еще одно приложение, которое будет печатать в консоль, какой сегодня день недели:
public static void main(String[] args) < // Определим текущий день недели DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek(); if (dayOfWeek == DayOfWeek.SUNDAY) < System.out.println("Сегодня воскресенье"); >else if (dayOfWeek == DayOfWeek.MONDAY) < System.out.println("Сегодня понедельник"); >else if (dayOfWeek == DayOfWeek.TUESDAY) < System.out.println("Сегодня вторник"); >else if (dayOfWeek == DayOfWeek.WEDNESDAY) < System.out.println("Сегодня среда"); >else if (dayOfWeek == DayOfWeek.THURSDAY) < System.out.println("Сегодня четверг"); >else if (dayOfWeek == DayOfWeek.FRIDAY) < System.out.println("Сегодня пятница"); >else if (dayOfWeek == DayOfWeek.SATURDAY) < System.out.println("Сегодня суббота"); >>
Удобно конечно, но в глазах немного рябит от обилия однообразного текста. В ситуациях, когда у нас имеются большое количество вариантов лучше использовать оператор, речь о котором пойдет ниже.
switch-case
Альтернативой жирным if с большим количеством ветвей служит оператор switch-case . Данный оператор как бы говорит “Так, у нас есть вот такая вот переменная. Смотрите, в случае, если её значение равно `x`, то делаем то-то и то-то, если ее значение равно `y`, то делаем по-другому, а если ничему не равно из вышеперечисленного, просто делаем вот так… ” Данный оператор обладает следующей структурой.
- byte and Byte
- short and Short
- int and Integer
- char and Character
- enum
- String
Стоит обратить внимание: между `case valueX:` и `case valueY:` нет оператора break . Здесь, если argument будет равен value1 , выполнится statement1 . А если argument будет равен valueX либо valueY , выполнится statementXY . Разбавим тяжелую для восприятия теорию на легкую для восприятия практику. Перепишем пример с днями недели с использованием оператора switch-case .
public static void main(String[] args) < // Определим текущий день недели DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek(); switch (dayOfWeek) < case SUNDAY: System.out.println("Сегодня воскресенье"); break; case MONDAY: System.out.println("Сегодня понедельник"); break; case TUESDAY: System.out.println("Сегодня вторник"); break; case WEDNESDAY: System.out.println("Сегодня среда"); break; case THURSDAY: System.out.println("Сегодня четверг"); break; case FRIDAY: System.out.println("Сегодня пятница"); break; case SATURDAY: System.out.println("Сегодня суббота"); break; >>
Теперь напишем программу, которая выводит информацию о том, является ли сегодняшний день будним днем или выходным, используя оператор switch-case .
public static void main(String[] args) < // Определим текущий день недели DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek(); switch (dayOfWeek) < case SUNDAY: case SATURDAY: System.out.println("Сегодня выходной"); break; case FRIDAY: System.out.println("Завтра выходной"); break; default: System.out.println("Сегодня рабочий день"); break; >>
Немного поясним. В данной программе мы получаем enum DayOfWeek , который обозначает текущий день недели. Далее мы смотрим, равняется ли значение нашей переменной dayOfWeek значениям SUNDAY либо SATURDAY . В случае, если это так, программа выводит “Сегодня выходной”. Если же нет, то мы проверяем, равняется ли значение переменной dayOfWeek значению FRIDAY . В случае, если это так, программа выводит “Завтра выходной”. Если же и в этом случае нет, то вариантов у нас немного, любой оставшийся день является будним днем, поэтому по умолчанию, если сегодня НЕ пятница, НЕ суббота и НЕ воскресение программа выведет “Сегодня рабочий день”.