我想在使用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值。
为什么编译器占用最后一个值?
有什么建议吗?
答案 0 :(得分:2)
1)您将0
指定为用于获取用户输入的n
整数的默认值:int n = 0;
因此,如果输入触发了InputMismatchException
,则您的while
语句中的n
等于0
,while (n > 100)
n = 0
为false
{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;
}
}