Java实现输入0终止受控循环时运行崩溃问题
问题原因
- 循环判断逻辑顺序写反了:do-while块里,你刚把用户输入存到
n[i],马上就执行i++把下标加了1,后面while判断读的是n[i]——也就是下一个还没存过用户输入的位置。new出来的int数组所有元素默认初始值是0,第一次输完内容后i从0变成1,判断n[1] != 0直接不成立,循环当场终止,自然不会弹出第二次输入提示。 - 藏着数组越界崩溃的隐患:原逻辑没做数组长度校验,i会一直自增,等i涨到100的时候再访问
n[100]就会直接抛ArrayIndexOutOfBoundsException,毕竟你定义的数组长度只有100,合法下标最多到99。 - 计数逻辑多余还出错:
i本身就能统计已经存了多少个有效年龄,单独写个counter完全是重复变量;而且原逻辑会把用来终止程序的0也存进数组、算入计数,最后打印的时候会把这个无效的0也输出来。 - 代码和注释不匹配:注释写了“只打印前10个年龄”,实际打印循环是把所有计数的元素都打出来了,没做数量限制。
修复方法
核心是调整执行顺序:先拿到用户输入,先判断是不是终止符0,再决定要不要存到数组、移动下标,同时加上数组最大容量的校验,修正打印逻辑。可运行的修复后代码如下:
import java.util.Scanner; public class AgeCollector { public static void main(String[] args) { int[] n = new int[100]; // 数组最大存储长度为100 int i = 0; Scanner userInput = new Scanner(System.in); int inputValue; do { System.out.println("输入第" + (i + 1) + "个年龄,输入0即可终止:"); inputValue = userInput.nextInt(); // 输入0直接终止循环,不存入数组 if (inputValue == 0) { break; } // 达到数组存储上限时提示并终止 if (i >= n.length) { System.out.println("已达到最大存储数量,停止接收输入"); break; } n[i] = inputValue; i++; } while (true); // 按照注释要求,最多打印前10个有效年龄 int printTotal = Math.min(i, 10); for (int j = 0; j < printTotal; j++) { System.out.println("第" + (j + 1) + "个年龄是 " + n[j]); } userInput.close(); } }
如果不想额外定义inputValue变量,也可以在原逻辑基础上调整:把while的判断条件改成判断上一个存入的元素(也就是n[i-1] != 0),同时加上i的边界判断,不过这种写法可读性差,很容易再写出下标相关的bug,不推荐使用。
内容的提问来源于stack exchange,提问作者Younis
相关产品推荐
相关产品推荐

