这是一个程序,它通过 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()
or in.nextFloat()
or in.nextDouble()
,那怎么没有3个输入数据的提示3 个不同的函数调用(hasNextInt()
和 hasNextFloat()
和 hasNextDouble()
)?
最佳答案
扫描器将尝试解析下一个输入,如果成功则数据类型适合。
例如,看一下 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;
}
如您所见,涉及多个步骤:
- 检查输入是否与 float 模式匹配,即它看起来像 float 吗?
- 如果输入看起来像一个 float ,尝试解析它。如果失败则不是 float ,如果有效则至少是 float (可以是
double
甚至是int
作为好吧,这就是为什么您发布的代码会按顺序检查 int、float 和 double)。
关于java - 这个程序如何在不知道数据类型的情况下接受数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37696831/