You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:39:23