在用户输入时验证数据类型

时间:2017-04-16 14:30:47

标签: java validation int try-catch java.util.scanner

我想在使用Scanner进行用户输入时验证数据类型(在我的例子中是' int')。

我在下面写了代码。

    public static void main(String[] args) throws IOException {

    Scanner scanner = new Scanner(System.in);

    System.out.println("Enter size of an array...");
    int n = 0;

     // 1st block, n <= 100
    do {
        System.out.println("Capacity must be less than or equal to 100");
        try {
            n = scanner.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Enter only integers ");
        }
    } while (n > 100);

    int[] arr = new int[n];

    // block 2. Value must be greater than 0 and less than 10000
    for (int i = 0; i < n;) {
        do {
            try {
                arr[i] = scanner.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Enter only integer value");
            }
        } while (arr[i] > 10000 || arr[i] < 1);
        i++;
    }

    scanner.close();

    for (int i = n - 1; i >= 0; i--)
        System.out.println(arr[i]);
    }
}

问题是, 在第一个块中,如果我给出字符,程序终止。 &#34;如何在验证失败时保持循环运行?&#34;

在第二个块中,如果我给出非整数,它会无限运行,并且#34;只输入整数值&#34;。

从调试开始,我得出结论:在不等待输入的情况下,它需要使用之前提供的最后一个非int值。

为什么编译器占用最后一个值?

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

1)您将0指定为用于获取用户输入的n整数的默认值:int n = 0;
因此,如果输入触发了InputMismatchException,则您的while语句中的n等于0while (n > 100) n = 0false {1}}。
所以你退出循环。
要解决这个问题:

  • 使用包装器整数:Integer n = null;具有可空值,可以知道扫描仪读取中是否没有接受任何值

  • 更改while语句条件以检查您的要求:

    while (n == null || n > 100);


2)对于第二种情况的第一种情况,如果输入与所需类型(此处为int值)不匹配,则不读取扫描仪中的当前标记。
只需忽略此标记以避免进入无限循环:

   catch (InputMismatchException e) {
        ...
        scanner.nextLine();
    }

答案 1 :(得分:1)

作为davidxxx答案的补充: 这是使用Scanner.hasNextInt()方法的相同代码。

Scanner scanner = new Scanner(System.in);

System.out.println("Enter size of an array...");
while (!scanner.hasNextInt()) scanner.next();
int arrayLength = scanner.nextInt();

int[] arr = new int[arrayLength];

boolean arrayFull = false;
int index = 0;

System.out.println("Enter array values");
while (!arrayFull){
    while (!scanner.hasNextInt()) scanner.next();
    int value = scanner.nextInt();
    if (value < 0 || value > 1000) {
        System.out.println("Enter only integer value < 0 and > 1000");
        continue;
    }
    arr[index++] = value;

    if (index >= arrayLength){
        arrayFull = true;
    }
}