我想从用户那里获取输入,然后想要找到它是Integer,float还是其他东西。直到现在我正在使用Scanner类。像Scanner scan1=new Scanner(System.in);
String st= scan1.next();
一样,然后我试图分别在int和float中解析输入(st)。但是通过这种方法,我无法满足“其他”条件。即输入既不是字符串,也不是浮点数。
以下是我尝试的代码: -
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条件来检查输入既不是字符串,也不是整数。
答案 0 :(得分: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";
}
statement
拉出constant,因为它没有被更改。Scanner
作为参数传递,而不是构造一个新参数。有很多理由喜欢这个,但原则之一是你应该避免创建从Scanner
读取的多个System.in
个实例 - 通常你会创建这样一个Scanner
您的main()
方法并将其传递给需要使用它的方法和类。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!");
}
}
}
所有这些,我们在这里重新发明了轮子。 &#34;权利&#34;使用Scanner
的方法是直接使用类型化方法 - 例如:
if (scanner.hasNextInt()) {
int value = scanner.nextInt();
}
这可以避免需要进行任何手动类型检查或类似的繁忙工作 - 只需让Scanner
为您进行验证。