Java 中的 while 循环

更新于 2025-12-25

Jakob Jenkov 2024-05-09

Java 的 while 循环与 for 循环 类似。while 循环允许你的 Java 程序在某个条件为真时重复执行一组操作。

Java 的 while 循环有两种变体:常用的 while 循环和较少使用的 do while 循环。本文将介绍这两种 while 循环。


Java while 循环

首先来看最常用的 Java while 循环形式。以下是一个简单的 Java while 循环示例:

int counter = 0;
while(counter < 10) {
    System.out.println("counter: " + counter);
    counter++;
}

此示例展示了一个 while 循环,只要变量 counter 小于 10,就会执行循环体。在循环体内,counter 被递增。最终,counter 不再小于 10,while 循环停止执行。

下面是另一个使用布尔值进行判断的 while 示例:

boolean shouldContinue = true;
while(shouldContinue == true) {
    System.out.println("running");
    double random = Math.random() * 10D;
    if(random > 5) {
        shouldContinue = true;
    } else {
        shouldContinue = false;
    }
}

这个 Java while 示例检查布尔变量 shouldContinue,以决定是否继续执行循环。如果 shouldContinue 的值为 true,则再次执行循环体;如果为 false,则退出 while 循环,程序继续执行 while 循环之后的语句。

在循环体内会生成一个 0 到 10 之间的随机数。如果该随机数大于 5,则 shouldContinue 被设为 true;否则设为 false

for 循环一样,while 循环体周围的花括号是可选的。如果你省略了花括号,那么 while 循环体将只包含紧随其后的第一个 Java 语句。下面是一个省略花括号的示例:

while(iterator.hasNext())
    System.out.println("next: " + iterator.next()); // 在循环中执行
System.out.println("second line"); // 循环结束后执行

在此示例中,只有第一个 System.out.println() 语句在 while 循环内执行。第二个 System.out.println() 语句在 while 循环结束后才执行。

忘记在 while 循环体周围加上花括号是一个常见错误。因此,养成始终加上花括号的习惯是个好主意。


Java do while 循环

Java while 循环的第二种形式是 do while 结构。下面是一个 Java do while 示例:

InputStream inputStream = new FileInputStream("data/text.xml");
int data;
do {
    data = inputStream.read();
} while(data != -1);

注意,while 循环的条件现在移到了 do while 循环体之后。do while 循环体至少会执行一次,然后只要 while 条件为 true 就会继续重复执行。

两种 while 循环变体的主要区别在于:do while 循环在测试条件之前至少会执行一次,而普通的 while 循环则可能一次都不执行。

这两种 while 循环变体适用于不同场景。我主要使用第一种 while 循环,但有时也会用到第二种。


continue 语句

Java 中包含一个 continue 语句,可以在 while(以及 for)循环内部使用。continue 语句放在循环体内部。当遇到 continue 语句时,Java 虚拟机会跳过当前循环体中剩余的部分,直接进入下一次迭代。

下面是一个在 while 循环中使用 continue 的简单示例:

String[] strings = { "John", "Jack", "Abraham", "Jennifer", "Ann" };
int wordsStartingWithJ = 0;
int i = 0;
while(i < strings.length) {
    if(!strings[i].toLowerCase().startsWith("j")) {
        i++;
        continue;
    }
    wordsStartingWithJ++;
    i++;
}

注意 while 循环内的 if 语句。它检查 strings 数组中的每个字符串是否不以字母 j 开头。如果是,则执行 continue 语句,跳过本次循环的其余部分,直接进入下一次迭代。

如果当前字符串确实以字母 j 开头,则执行 if 语句之后的代码,将 wordsStartingWithJ 变量加 1。

continue 语句同样适用于 do while 循环。以下是上述示例的 do while 版本:

String[] strings = { "John", "Jack", "Abraham", "Jennifer", "Ann" };
int wordsStartingWithJ = 0;
int i = 0;
do {
    if(!strings[i].toLowerCase().startsWith("j")) {
        i++;
        continue;
    }
    wordsStartingWithJ++;
    i++;
} while(i < strings.length);

注意:这种 while 循环形式要求 strings 数组至少包含一个元素,否则在 do while 循环的第一次迭代中尝试访问索引 0 时会失败。


break 语句

break 语句可以在 Java 的 while(以及 for)循环内部使用。当遇到 break 语句时,Java 虚拟机会立即跳出 while 循环,即使循环条件仍为 true。一旦执行 break,将不再执行任何后续的循环迭代。

下面是在 while 循环中使用 break 的示例:

String[] strings = { "John", "Jack", "Abraham", "Jennifer", "Ann" };
int wordsStartingWithJ = 0;
int i = 0;
while(i < strings.length) {
    if(strings[i].toLowerCase().startsWith("j")) {
        wordsStartingWithJ++;
    }
    if(wordsStartingWithJ >= 3) {
        break;
    }
    i++;
}

注意 while 循环中的第二个 if 语句。它检查是否已找到 3 个或更多以字母 j 开头的单词。如果是,则执行 break 语句,程序立即跳出 while 循环。

continue 语句类似,break 语句也适用于 do while 循环。以下是使用 do while 的版本:

String[] strings = { "John", "Jack", "Abraham", "Jennifer", "Ann" };
int wordsStartingWithJ = 0;
int i = 0;
do {
    if(strings[i].toLowerCase().startsWith("j")) {
        wordsStartingWithJ++;
    }
    if(wordsStartingWithJ >= 3) {
        break;
    }
    i++;
} while(i < strings.length);

注意:这种形式要求 strings 数组至少有一个元素,否则在 do while 循环第一次迭代中访问数组索引 0 时会出错。


while 循环中的变量可见性

在 Java while 循环内部声明的变量仅在循环体内可见。看下面这个例子:

int count = 0;
while(count < 10) {
    String name = employees[i].getName();
    count++;
}

while 循环体执行完毕后,变量 count 仍然可见,因为它是在循环体外部声明的。但变量 name 不可见,因为它是在循环体内部声明的,因此只能在 while 循环体内使用。