Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在用户输入时验证数据类型_Java_Validation_Int_Try Catch_Java.util.scanner - Fatal编程技术网

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

Java 在用户输入时验证数据类型,java,validation,int,try-catch,java.util.scanner,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 &

我想在用户使用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]);
    }
}
publicstaticvoidmain(字符串[]args)引发IOException{
扫描仪=新的扫描仪(System.in);
System.out.println(“输入数组的大小…”);
int n=0;
//第1座,n 100);
int[]arr=新的int[n];
//块2.值必须大于0且小于10000
对于(int i=0;i10000 | | arr[i]<1);
i++;
}
scanner.close();
对于(int i=n-1;i>=0;i--)
系统输出打印项数(arr[i]);
}
}
问题是,, 在第一个块中,若我给出字符,程序终止“如何在验证失败时保持循环运行?”

在第二个块中,若我给出非整数,它将无限运行,并显示消息“仅输入整数值”

通过调试,我得出结论,在不等待输入的情况下,它会获取之前提供的最后一个非int值。

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

有什么建议吗?

1)指定
0
作为用于获取用户输入的
n
整数的默认值:
int n=0
因此,如果输入触发了一个
inputmaschException
,那么在
while
语句中出现
n
等于
0
,而
while(n>100)
with
n=0
false

因此,您将退出循环。
要解决这个问题:

  • 使用包装整数:
    Integer n=null允许了解扫描仪读取中是否未接受任何值

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

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


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

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

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

Scanner Scanner=新的扫描仪(System.in);
System.out.println(“输入数组的大小…”);
而(!scanner.hasNextInt())scanner.next();
int arrayLength=scanner.nextInt();
int[]arr=新的int[arrayLength];
布尔数组full=false;
int指数=0;
System.out.println(“输入数组值”);
而(!arrayFull){
而(!scanner.hasNextInt())scanner.next();
int value=scanner.nextInt();
如果(值<0 | |值>1000){
System.out.println(“仅输入小于0且大于1000的整数值”);
继续;
}
arr[index++]=值;
如果(索引>=阵列长度){
arrayFull=真;
}
}

我的第一个建议是将代码拆分为单独的方法。考虑到您的代码长度,这似乎是一个奇怪的建议,但这样您就可以一次处理一项功能,这将使您更容易理解自己的代码,使这些单独的部分正常工作,并轻松地将它们插入到一起。例如,对于代码的第一部分,您可以编写一条消息
getIntInput()
或一些类似的消息,如果用户输入了非数字的内容,则返回指示值
-1
。投票赞成您花时间理解OPs代码,并且不仅提供了解决方案,还提供了解释。只有一件事:我觉得在
输入不匹配异常
的情况下使用指示性值(比如
-1
Integer.MIN_值
)可能是一个更好的解决方案,而不是使用
Integer
,而不是
int
。当然,这是一个品味的问题。@davidxxx,因为两个块的答案都在于忽略当前标记。我在这两种情况下都使用了scanner.nextLine,问题就解决了。不需要包装整数。谢谢:)@domdom我喜欢你关于指示性价值的想法。不幸的是,我可以投票,因为排名低。非常感谢您的反馈。事实上,在op的情况下,它可能会稍微简单一点,而且似乎很适合。如果我们想在不引入其他变量的情况下区分非整数的不可接受值和整数但不在良好范围内的不可接受值,那么使用
null
可能有一点优势。带有
(n==-1)
您不一定知道用户是否输入了
-1
或非整数值。
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;
    }
}