These statements can be applied to single expressions as well as a block of Java code. As described in Chapter 1, a block of code in Java is a group of zero or more statements between balanced braces ({}
) and can be used anywhere a single statement is allowed. For example, the following two snippets are equivalent, with the first being a single expression and the second being a block containing the same statement:
// Single statement patrons++; // Statement inside a block { patrons++; }
A statement or block often serves as the target of a decision-making statement. For example, we can prepend the decision-making if
statement to these two examples:
// Single statement if(ticketsTaken> 1) patrons++; // Statement inside a block if(ticketsTaken> 1) { patrons++; }
Again, both of these code snippets are equivalent. Just remember that the target of a decision-making statement can be a single statement or block of statements. For the rest of the chapter, we use both forms to better prepare you for what you will see on the exam.
The if Statement
Often, we want to execute a block only under certain circumstances. The if
statement, as shown in Figure 3.1, accomplishes this by allowing our application to execute a particular block of code if and only if a boolean
expression evaluates to true
at runtime.
FIGURE 3.1 The structure of an if
statement
For example, imagine we had a function that used the hour of day, an integer value from 0
to 23
, to display a message to the user:
if(hourOfDay < 11) System.out.println("Good Morning");
If the hour of the day is less than 11, then the message will be displayed. Now let's say we also wanted to increment some value, morningGreetingCount
, every time the greeting is printed. We could write the if
statement twice, but luckily Java offers us a more natural approach using a block:
if(hourOfDay < 11) { System.out.println("Good Morning"); morningGreetingCount++; }
Watch Indentation and Braces
One area where the exam writers will try to trip you up is if
statements without braces ({}
). For example, take a look at this slightly modified form of our example:
if(hourOfDay < 11) System.out.println("Good Morning"); morningGreetingCount++;
Based on the indentation, you might be inclined to think the variable morningGreetingCount
is only going to be incremented if hourOfDay
is less than 11
, but that's not what this code does. It will execute the print statement only if the condition is met, but it will always execute the increment operation.
Remember that in Java, unlike some other programming languages, tabs are just whitespace and are not evaluated as part of the execution. When you see a control flow statement in a question, be sure to trace the open and close braces of the block, ignoring any indentation you may come across.
The else Statement
Let's expand our example a little. What if we want to display a different message if it is 11 a.m. or later? Can we do it using only the tools we have? Of course we can!
if(hourOfDay < 11) { System.out.println("Good Morning"); } if(hourOfDay >= 11) { System.out.println("Good Afternoon"); }
This seems a bit redundant, though, since we're performing an evaluation on hourOfDay
twice. Luckily, Java offers us a more useful approach in the form of an else
statement, as shown in Figure 3.2.
FIGURE 3.2 The structure of an else
statement
Let's return to this example:
if(hourOfDay < 11) { System.out.println("Good Morning"); } else System.out.println("Good Afternoon");
Now our code is truly branching between one of the two possible options, with the boolean
evaluation happening only once. The else
operator takes a statement or block of statements, in the same manner as the if
statement. Similarly, we can append additional if
statements to an else
block to arrive at a more refined example:
if(hourOfDay < 11) { System.out.println("Good Morning"); } else if(hourOfDay < 15) { System.out.println("Good Afternoon"); } else { System.out.println("Good Evening"); }
In this example, the Java process will continue execution until it encounters an if
statement that evaluates to true
. If neither of the first two expressions is true
, it will execute the final code of the else
block.
Verifying That the if Statement Evaluates to a Boolean Expression
Another common way the exam may try to lead you astray is by providing code where the boolean
expression inside the if
statement is not actually a boolean
expression. For example, take a look at the following lines of code:
int hourOfDay = 1; if(hourOfDay) { // DOES NOT COMPILE … }
This statement may be valid in some other programming and scripting languages, but not in Java, where 0
and 1
are not considered boolean
values.
Shortening Code with Pattern Matching
Java 16 officially introduced pattern matching with if
statements and the instanceof
operator. Pattern matching is a technique of controlling program flow that only executes a section of code that meets certain criteria. It is used in conjunction with if
statements for greater program control.
Pattern
class or regular expressions (regex). While pattern matching can include the use of regular expressions for filtering, they are unrelated concepts.
Pattern matching is a new tool at your disposal to reduce boilerplate in your code. Boilerplate code is code that tends to be duplicated throughout a section of code over and over again in a similar manner. A lot of the newer enhancements to the Java language focus on reducing boilerplate code.
To understand why this tool was added, consider the following code that takes a Number
instance and compares it with the value 5
. If you haven't seen Number
or Integer
,