该程序如何在不知道其数据类型的情况下接受数据?

时间:2016-06-08 08:13:05

标签: java java.util.scanner

这是一个程序,它通过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())的数据?

2 个答案:

答案 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;
}

如您所见,涉及以下几个步骤:

  1. 检查输入是否与浮动模式匹配,即看起来像一样浮动?
  2. 如果输入看起来像浮点数,请尝试解析它。如果失败则它不是浮点数,如果它有效,它至少浮点数(可能是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.");