CHAPTER 5 ■ CONTROL FLOW, LOOPING, AND BRANCHING
Listing 5-15. A more complete while loop
int counter = 0;
while (counter < 10) {
System.out.println(counter);
counter++;
}
That (still simple) example shows the typical structure of a while loop: declare a variable, test the
variable at the top of the while loop, do some work in the while loop, and increment the variable in the
while loop. After the test fails, the while loop is done, and the code below the while loop runs.
You can create a while loop that runs forever (or, more likely, until some condition that gets checked
by an if statement in the body of the loop triggers a break statement) by using while(true). That
construct is useful in some cases, but it's not a safe thing to do. Savvy programmers try to ensure that
loops can't run forever (that's called an infinite loop). What if, due to unexpected input data, your break
condition in the body of the loop never gets hit? Then your program is stuck (and that can be loads of fun
if it happens to be writing into a file—you can quickly cause problems for your operating system this
way). If you feel that you must use while(true), test thoroughly.
Another use for a while loop is to try something for a set amount of time when you don't know how
long each try will take. For example, suppose a mail client tries for one minute to connect to a mail
server and then gives up (that is, it times out). Listing 5-14 shows one way to wait for a connection.
Listing 5-14. While loop that waits for an event
boolean connected = false;
long now = System.currentTimeMillis();
long oneMinuteFromStart = System.currentTimeMillis() + 60000;
while (!connected && now < oneMinuteFromStart) {
System.out.println("Trying to connect....");
if (MailServer.connect()) {
connected = true;
break;
}
// pause for two seconds
// to let other processes work, too
try {
System.out.println("(letting other processes run)");
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
// reset now for the next comparison
now = System.currentTimeMillis();
}
if (connected) {
System.out.println("Connected to the mail server");
} else {
System.out.println("Timed out while trying to connect to the mail server");
}