2017-07-01 48 views
0

我想从用户那里获取输入,然后想要查找它是整数,浮点数还是其他值。直到现在我正在使用Scanner类。像Scanner scan1=new Scanner(System.in); String st= scan1.next();然后我试图解析输入(st)在int和float分别。但是采用这种方法我无法满足“其他”条件。即当输入既不是字符串,也不是浮点数。 下面是我试过的代码: -解析输入并确定数据类型

public String checkInput() { 
    String statement = "This input is of type "; 
    String inputType; 

    Scanner scan1 = new Scanner(System.in); 
    String st = scan1.next(); 
    scan1.close(); 
    inputType = st.getClass().getSimpleName(); 
    try { 
     Float numFloat = Float.parseFloat(st); 
     inputType = numFloat.getClass().getSimpleName(); 

    } catch (NumberFormatException e) { 

    } 
    try { 
     Integer numInt = Integer.parseInt(st); 
     inputType = numInt.getClass().getSimpleName(); 
    } catch (NumberFormatException e) { 

    } 

    return statement + inputType; 
} 

在这里我不能决定我应该怎么把else条件检查输入既不是字符串,也不上浮整数。

+1

将第三行改为'String inputType =“UNKNOWN”;' - 如果你的'try'块都失败了,你会返回''这个输入的类型是UNKNOWN'''。 – dimo414

+0

@ dimo414但考虑到第五行,如果输入不是float或Integer,它总是会返回inputType作为字符串。 –

+0

@Vic你能提供任何帮助或链接,我怎么能使用它。 –

回答

3

以下是我将如何重构您的代码。我会在下面解释的变化:

private static final String STATEMENT = "This input is of type "; 

public static String checkInput(Scanner scanner) { 
    if (scanner.hasNextFloat()) { 
    return STATEMENT + Float.class.getSimpleName(); 
    else if (scanner.hasNextInt()) { 
    return STATEMENT + Integer.class.getSimpleName(); 
    } 
    return STATEMENT + "UNKNOWN"; 
} 
  • 首先,我们拉出来statementconstant,因为它没有被改变。
  • 其次,我们通过Scanner作为参数,而不是构建一个新的。有多种原因可以选择,但原则是您应避免在System.in中创建多个Scanner实例 - 通常您会在main()方法中创建这样的Scanner,并将其传递给需要的方法和类使用它。
  • 接下来,我们使用has*()方法检查扫描仪的状态,而不是直接从扫描仪读取数据,而不是直接从扫描仪读取数据。这改变了checkInput()的语义,因为当它返回被检查的输入时仍然在扫描器中,但这与名为check...()的方法更为一致 - 应该检查,而不是更改状态。因为你的实现调用.next()你失去了实际提供的输入,这可能是不可取的。
  • 最后,我们return从每个块内,而不是设置一个临时inputType变量,并在最后返回它。

main()方法现在看起来可能是这样:

public static void main(String[] args) { 
    // using try-with-resources so we don't have to call .close() 
    try (Scanner scanner = new Scanner(System.in)) { 
    System.out.println(checkInput(scanner)); 
    String input = scanner.next(); // this actually advances the scanner 
    System.out.println("You input: " + input); 
    } 
} 

采取进一步行动,你可能更喜欢让checkInput()返回Class<?>而非String,然后分别构建你的声明。这将允许您以不同方式处理输入。例如:

public static Class<?> inputType(Scanner scanner) { 
    if (scanner.hasNextFloat()) { 
    return Float.class; 
    else if (scanner.hasNextInt()) { 
    return Integer.class; 
    } 
    // add other types as needed 
    return String.class; 
} 

public static void main(String[] args) { 
    try (Scanner scanner = new Scanner(System.in)) { 
    Class<?> inputType = inputType(scanner); 
    String input = scanner.next(); 
    System.out.println("You input: " + input); 
    if (inputType.equals(Integer.class)) { 
     System.out.prinln("That's a valid integer!"); 
    } 
    } 
} 

所有这一切说,我们非常这里重新发明轮子。 “正确”的方式来使用Scanner是直接使用的类型的方法 - 例如: -

if (scanner.hasNextInt()) { 
    int value = scanner.nextInt(); 
} 

这避免了需要做任何手动型检查或类似的无用功 - 只是让Scanner为你做验证。

+0

感谢您的详细解释:) –