Java 在用户输入时验证数据类型
我想在用户使用Scanner输入时验证数据类型(在我的示例中是“int”) 我在下面写了代码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 &
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)
withn=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;
}
}