这是一个程序,它通过System.in输入流检查可用的输入类型,并决定将变量存储在哪个数据类型中。程序代码为:
import java.util.Scanner;
public class hasNextNumberDemo
{
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
System.out.print("Enter your Data :");
if(in.hasNextInt())
System.out.println("You have entered an Integer as : " + in.nextInt());
else if(in.hasNextFloat())
System.out.println("You have entered an Float Value as : " + in.nextFloat());
else if(in.hasNextDouble())
System.out.println("You have entered an Double Value as : " + in.nextDouble());
else
System.out.println("Token not an Integer or a real value.");
}
}
在这里,我们清楚地看到数据可以通过多个点接受:in.nextInt()
或in.nextFloat()
或甚至in.nextDouble()
,但所有数据前面都有一个语句来检查数据的类型。输入(尚未输入[通过hasNextInt()
或hasNextFloat()
或hasNextDouble()
])。
我的问题是,在接受数据之前,程序如何确定下一个令牌的数据类型是什么?
此外,如果hasNextInt()
或hasNextFloat()
或hasNextDouble()
触发数据输入,而不是in.nextInt()
或in.nextFloat()
或in.nextDouble()
,那么为什么没有3个提示输入3个不同函数调用(hasNextInt()
和hasNextFloat()
和hasNextDouble()
)的数据?
答案 0 :(得分:4)
扫描程序将尝试解析下一个输入,如果成功,则数据类型适合。
作为示例,我们来看看hasNextFloat()
的实现:
public boolean hasNextFloat() {
setRadix(10);
boolean result = hasNext(floatPattern());
if (result) { // Cache it
try {
String s = processFloatToken(hasNextResult);
typeCache = Float.valueOf(Float.parseFloat(s));
} catch (NumberFormatException nfe) {
result = false;
}
}
return result;
}
如您所见,涉及以下几个步骤:
double
甚至是int
,这就是代码的原因你按顺序发布了int,float和double的检查。)答案 1 :(得分:1)
第一个if(in.hasNextInt())
将等到您按Enter键。它和所有后续的has
- 方法都可以使用该输入行,直到next
- 方法消耗它。
hasNext()
。控制台输入没有结束,因此hasNext()
最终将为true
。但扫描仪无法确定,直到它的缓冲区中有一行文本作为证据。
您可以重写您拥有的代码
Scanner in = new Scanner(System.in);
System.out.print("Enter your Data :");
String next = in.next();
if (isInt(next))
System.out.println("You have entered an Integer as : " + parseInt(next);
else if(isFloat(next))
System.out.println("You have entered an Float Value as : " + parseFloat(next));
else if(isDouble(next))
System.out.println("You have entered an Double Value as : " + parseDouble(next));
else
System.out.println("Token not an Integer or a real value.");