如何在java中使用输入整数的附加条件实现hasNextInt()
我有与此相同的问题,我需要确保用户输入是一个整数,并且也由7位数字组成,在这里,我认为需要一个介于0和150之间的整数: 我试过这个如何在java中使用输入整数的附加条件实现hasNextInt(),java,while-loop,integer,do-while,Java,While Loop,Integer,Do While,我有与此相同的问题,我需要确保用户输入是一个整数,并且也由7位数字组成,在这里,我认为需要一个介于0和150之间的整数: 我试过这个 System.out.print("Please enter your ID without any spaces (7 digits): "); while (in.hasNextInt() == false || in.nextInt()/1000000 == 0 || in.nextInt()/10000000 >
System.out.print("Please enter your ID without any spaces (7 digits): ");
while (in.hasNextInt() == false || in.nextInt()/1000000 == 0 || in.nextInt()/10000000 > 0)
// division with two integers by a million, if you had less than 7 digits would give zero
// division with two integers by ten million, if you had more than 7 digits would give you greater than zero
{
in.next();
System.out.print("Please enter your ID without any spaces (7 digits): ");
}
student_ID = in.nextInt();
// Sample Output:
Please enter your ID without any spaces (7 digits): 123
然后它就停在那里,即使后面还有其他打印语句。如果我将放在while
的括号中,那么它仅适用于.hasNextInt()中的部分,但是我不知道如何向while循环添加更多条件(提示用户输入7位整数),我也尝试了do循环,但没有成功
p、 我知道在学生ID前面没有int
,我在代码的上面声明了一个整数变量,所以不用担心:)你在程序中犯了很多逻辑错误。让我们逐行检查。提示用户输入7位数字后。你进入while循环
while (in.hasNextInt() == false || in.nextInt()/1000000 == 0 || in.nextInt()/10000000 > 0)
假设您键入123并按enter键。此123将由
中的扫描仪对象使用。现在,
中的只包含一个令牌123
。现在发生了什么
while循环文本表达式中的第一个条件是in。选中hasNextInt()==false
。由于
中的确实有一个int
作为下一个标记,因此它的计算结果将为false。但是,
中的仍将包含23。根据docs.oracle.com:
public boolean hasnetint(整数基数)
如果此扫描仪输入中的下一个令牌可以
使用nextInt()将其解释为指定基数中的int值
方法。扫描仪不会超过任何输入
现在,控件将传递到while循环文本表达式中的下一个条件in.nextInt()/1000000
。此处,23
将作为int扫描并返回。所以你的情况会评估为真。由于使用了短路逻辑运算符,因此未检查while循环测试表达式中的下一个条件。以下是有关短路逻辑运算符的链接,以了解更多信息
您的程序控制现在将进入while循环。这里的第一条语句是.next()中的
。但是,
中的“内没有可用的令牌。因此,它将停止在那里等待用户输入。这就解释了你的说法
然后它就停在那里,即使后面还有其他打印语句
更糟糕的是,in.next()
将接受任何有效的输入。因此,您甚至可以输入abc,循环将继续这与您想要的相反
publicstringnext()
查找并返回此扫描程序中的下一个完整令牌。A.
完整标记的前面和后面是与
分隔符模式。此方法在等待输入时可能会阻塞
扫描,即使上一次调用hasNext()返回true
以下是有关java中scanner类的更多信息的链接:
在你的程序中有更多的潜在错误,我不能在这个答案中分享,因为它使它相当长。但是,我将根据您的需要提供一个代码:
do
{
System.out.print("Please enter your ID without any spaces (7 digits): ");
// division with two integers by a million, if you had less than 7 digits would give zero
// division with two integers by ten million, if you had more than 7 digits would give you greater than zero
if (in.hasNextInt()) number = in.nextInt();
else in.next();
}
while (number/1000000 == 0 || number/10000000 > 0);
该程序由一个简单的do-while循环组成。循环中的第一条语句提示用户输入他的UID(7位数字)。假设用户键入23并按enter键。然后,该输入存储在某个位置,供
中的扫描仪对象使用。让我们调用此空间输入缓冲区。目前它包括:
23\n
\n
代表换行符馈送
。在循环中,下一条语句是:
in.hasNextInt()编号=in.nextInt()
if条件为true,因为输入缓冲区中确实存储了int,即23
。if后面的语句从输入缓冲区中提取23,跳过\n
,并将提取的数字存储在number
中。然后,控制传递到do的测试条件,而由于数字没有通过给定的约束,循环再次启动。目前,输入缓冲区包括:
它是空的。现在假设这次用户输入了abc
,然后按enter键。输入缓冲区更新为:
abc\n
由于输入缓冲区
不包含int
,因此程序控制再次传递到if条件
,其计算结果为false
。我们必须从输入缓冲区中删除abc
。如果我们不这样做,那么在do while循环中对If
条件的每次调用将计算为false
,number
仍然包含23
,因此循环的最终测试条件将始终为true
,从而导致无限循环
这就是为什么需要else
部分中的.next()
中的:
else in.next()
由于if条件
为false,程序控制移动到else部分,在那里调用in.next()
从输入缓冲区
提取abc
,跳过\n
,并且不将其存储在任何地方它清空任何非int部分的输入缓冲区。
如果您不提供任何输入并继续按enter键,请在此实现中注意。此提示信息请输入您的ID,不带空格(7位):
将不会显示,因为您需要向扫描仪提供至少一个字符(不包括分隔符)的输入
即使有一个称为输入缓冲区的空间
。它的工作并不像我解释的那么简单。这种方法在简单的程序中确实有效。然而,在复杂的程序中,更好的方法应该是ado