如何在java中使用输入整数的附加条件实现hasNextInt()

如何在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 >

我有与此相同的问题,我需要确保用户输入是一个整数,并且也由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 > 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