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

Java中For循环与If-Else结合时的InputMismatchException问题求助

问题分析与解决方案

嘿,我来帮你看看这个问题~你的核心问题确实出在循环嵌套的逻辑错误上,另外还有个小问题是数组打印的逻辑不对,咱们一步步拆解:

为什么会抛出InputMismatchException?

你外层的while(in.hasNextInt())本来是用来判断是否还有整数可以读取,但内层套了个for循环——这个for循环是按当前数组的长度去强制读取对应次数的整数。举个例子:

  • 初始数组长度是2,第一次进入while循环后,for会执行2次,读取2个整数;
  • 当你输入第3个整数后,数组扩容到4,但当前for循环已经走完了(因为循环开始时numList.length是2),会回到while判断,这时候如果输入非整数,while会直接退出吗?不会!因为你可能在for循环执行到一半时遇到非整数:比如你输入1 2 a,while判断hasNextInt()是true(还有1、2两个整数),进入for循环,第一次读1没问题,第二次尝试读a,这时候hasNextInt()已经是false,但for循环还在执行,调用in.nextInt()就直接抛出异常了。

另外,你最后打印数组时用了增强for循环遍历整个数组,会把未赋值的默认0也打印出来,这不是你想要的结果。

修复后的代码

import java.util.Scanner;
import java.util.Arrays;

public class ArrayPrinter{
    public static int DEFAULT_LENGTH = 2;
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int currentSize = 0;
        int[] numList = new int[DEFAULT_LENGTH];
        System.out.println("Please insert value to store in array: ");
        
        // 去掉内层for循环,逐个处理输入
        while(in.hasNextInt()){
            // 先检查是否需要扩容,再存元素
            if(currentSize == numList.length){
                numList = Arrays.copyOf(numList, currentSize * 2);
                System.out.println("Array expanded to size: " + numList.length);
            }
            numList[currentSize] = in.nextInt();
            currentSize++;
            System.out.println("No of elements: " + currentSize);
            System.out.println("Current array capacity: " + numList.length);
        }
        
        // 只打印真正存入的元素(前currentSize个)
        System.out.println("\nFinal array content:");
        for(int i = 0; i < currentSize; i++){
            System.out.print(numList[i] + " ");
        }
        
        // 关闭Scanner,养成良好习惯
        in.close();
    }
}

关键修改点说明

  1. 移除内层for循环:直接在while循环里逐个处理输入,每次读取前都会通过hasNextInt()判断是否有整数,彻底避免了读取非整数的情况,也就不会抛出异常了。
  2. 调整扩容时机:先检查是否需要扩容,再存入元素,逻辑更顺畅。
  3. 修正打印逻辑:只遍历前currentSize个元素,这样只会打印你真正输入的整数,不会出现多余的0。
  4. 添加Scanner关闭:用完资源及时关闭,是Java的良好编码习惯。

现在你可以测试一下:输入任意数量的整数,中途输入字母就能正常退出循环,然后正确打印你输入的所有元素啦~

内容的提问来源于stack exchange,提问作者Intern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:26