Quick Quiz
/* Please do not write a class specification or any method specification. * Instead, please write only a code segment. * the code segment should print the numbers 1, 2, 3, .., 10 */ int number=1; while (number <=10) { System.out.println (number); number++ }
The for loop
Let's consider the example of the quiz one more time. Take another look at it. Notice that there are really four parts:
- Initialization:
int number=1;- Body (what we want to repeat):
System.out.println(number);- Increment (to set up for next time):
number++;- Predicate (to end the loop):
number<=10This idiom is extremely common in programming. As a result, Java has a special loop construct to support it, the "for loop". The for loop is no more or less powerful than the while loop. In the mathematical sense, it is completely equivalent. But, as a matter of practice, choosing the right loop can make our code much more readable.
Let me introduce the for loop by way of example. Consider the following rewritten version of the loop above:
for (int number=0; number <= 10; number++) { System.out.println (number); }Do you see the relationship between the elements of the for loop and those of the while loop? Below is the general form of the for loop:
for (initialization; predicate; increment) { body }It is perfectly legal for any or all of the initialization, predicate, or increment to be empty. For example, consider the following example of a degenerate form of the for loop, which is exactly equivalent to the while loop:
int number = 10; for ( ; number <= 10; ) { System.out.println (number); number++; }
Choosing the Right Loop
By selecting a for loop, when appropriate, we can make immediately clear to the reader:
- The conditions at the time the loop begins, and
- The condition that cause the loop to end, and
- What moves the loop from beginning to end, and
- What the loop does through each pass
By choosing a while loop, where appropriate, we can make immediately clear to the reader that:
- The initialization isn't a simple state variable, and/or
- The way the state changes isn't necessarily the same each time, and
- The condition that cause the loop to end
break
What happens if we want to end a loop "early", without returning to the predicate? A "break" statement exists for this purpose. If a "break" occurs within a loop, the loop immediately ends. The code within the loop, after the break, does not get executed. And, the loop doesn't start over. It just ends. The flow of control picks up right after the loop.Please consider the following typical example:
String userInput; while (true) { System.out.println ("Enter the next number, or a blank line to quit."); userInput = br.readLine(); if (userInput.equals("")) break; System.out.println ("You entered: " + userInput); } System.out.println ("Thanks for playing!");Notice how the break allowed us to test a condition within the loop. It can also be combined with a predicate:
System.out.println ("Please enter up to 10 numbers or a blank line to quit"); for (int number=0; number <=10; number++) { System.out.print ("Enter number" + number + ": "); String userInput = br.readLine(); if (userInput.equals("")) break; System.out.println ("For number" + number + ", you entered: " + userInput); } System.out.println ("Thanks for playing!");
continue
The break statement, as described above, immediately takes the flow of control out of a loop. By contrast, the continue statement causes the flow of control to go immediately back to the "top" of the loop, where the predicate is evaluated. If a continue is reached, the subsequent code is not executed, the increment of a for loop doesn't occur. Instead, "without passing go or collecting $500", control returns immediately to the top of the loop.Please consider the example below:
System.out.println ("Please enter five numbers between 1 and 10..."); for (int count=0; count <= 5; count++) { System.out.print ("Please enter number " + count + ": "); int number = Integer.parseInt (br.readLine()); // Note: This may be the first time you've seen || // it means logical OR, in other words either-or, or at least one if ( (number < 1) || (number > 10) ) { System.out.println ("" + number + " isn't between 1 and 10, inclusive."); continue; // Back to the top, the "count" control variable will be unchanged } System.out.println ("Number " + count + " is " + number + "."); }