For循环和If Else语句的InputMismatchException问题

时间:2019-11-29 08:54:06

标签: arrays for-loop while-loop user-input inputmismatchexception

我是Java新手。如果您能帮助我解决这个问题,我将不胜感激。 我正在尝试制作一个程序来读取用户输入(整数)并将其存储到数组中,然后打印出来。 我使用一个名为 currentSize 的变量来跟踪插入了多少个变量。

由于我不知道会有多少输入,因此每次元素编号等于数组长度时,我都会使用 Arrays.copyOf 方法将现有数组的大小加倍。

我在 in.hasNextInt()中使用while循环,目的是一旦用户输入其他字母(例如字母)而不是整数,则退出while循环。

我的问题是,尽管输入非整数值会退出while循环,但它仍然会引发InputMismatchException。

当我试图找出问题出在哪里时,我添加了2条print语句,以确保元素数量正确计数并且Array长度正在增加其大小。

System.out.println("No of elements: " + currentSize);
System.out.println("Array size: " + numList.length);

我尝试了另一种方法,并且使它能按我想要的方式工作而没有 for 循环,因此我怀疑while循环是问题所在。

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);
        //keep track of how many element we insert
        int currentSize = 0;
        int[] numList = new int[DEFAULT_LENGTH];

        System.out.println("Please insert value to store in array: ");
        while(in.hasNextInt()){
            for(int i = 0; i < numList.length; i++){
                numList[i] = in.nextInt();
                currentSize++;
                System.out.println("No of elements: " + currentSize);
                System.out.println("Array size: " + numList.length);
                if(currentSize == numList.length){
                    numList = Arrays.copyOf(numList, currentSize * 2);
                }       
            }
        }
        for(int number : numList){
            System.out.print(number + " ");
        }
    }
}

这可能很简单,但我浏览了Stack上的所有其他帖子,但无济于事。

非常感谢您!

1 个答案:

答案 0 :(得分:0)

您的算法有问题。包含while(in.hasNextInt())的行仅运行一次, 在第一次输入之前。之后,第二个循环for(int i = 0; i < numList.length; i++)将无限期运行,或者直到您键入无效的整数为止。

为了理解问题,您需要仔细查看发生异常的行:numList[i] = in.nextInt();。方法in.nextInt无法处理无效的输入。

您仅需要“ for”循环,并且需要在其中使用hasNextInt

for (int i = 0; i < numList.length; i++) {
    if (in.hasNextInt()) {
        numList[i] = in.nextInt();
        currentSize++;
        System.out.println("No of elements: " + currentSize);
        System.out.println("Array size: " + numList.length);
        if (currentSize == numList.length) {
            numList = Arrays.copyOf(numList, currentSize * 2);
        }
    }
}

for (int number : numList) {
    System.out.print(number + " ");
}

我知道您正在玩循环和数组以学习它。但是,要实现此逻辑 您应该以更简单的方式使用列表。 List(即:ArrayList)可以自动处理可变数量的项目,并且您的最终代码会简单得多。