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(); } }
关键修改点说明
- 移除内层for循环:直接在
while循环里逐个处理输入,每次读取前都会通过hasNextInt()判断是否有整数,彻底避免了读取非整数的情况,也就不会抛出异常了。 - 调整扩容时机:先检查是否需要扩容,再存入元素,逻辑更顺畅。
- 修正打印逻辑:只遍历前
currentSize个元素,这样只会打印你真正输入的整数,不会出现多余的0。 - 添加Scanner关闭:用完资源及时关闭,是Java的良好编码习惯。
现在你可以测试一下:输入任意数量的整数,中途输入字母就能正常退出循环,然后正确打印你输入的所有元素啦~
内容的提问来源于stack exchange,提问作者Intern
相关产品推荐
相关产品推荐

