如何使用Scanner仅接受有效的int作为输入

我正在尝试使一个小程序更强大,我需要一些帮助。

Scanner kb = new Scanner(System.in); int num1; int num2 = 0; System.out.print("Enter number 1: "); num1 = kb.nextInt(); while(num2 < num1) { System.out.print("Enter number 2: "); num2 = kb.nextInt(); } 
  1. 数字2必须大于数字1

  2. 此外,我希望程序自动检查并忽略用户是否输入字符而不是数字。 因为现在当用户输入例如r而不是数字时,程序才会退出。

使用Scanner.hasNextInt()

如果使用nextInt()方法将此扫描器输入中的下一个标记解释为默认基数中的int值,则返回true 。 扫描仪不会超过任何输入。

这是一个片段来说明:

 Scanner sc = new Scanner(System.in); System.out.print("Enter number 1: "); while (!sc.hasNextInt()) sc.next(); int num1 = sc.nextInt(); int num2; System.out.print("Enter number 2: "); do { while (!sc.hasNextInt()) sc.next(); num2 = sc.nextInt(); } while (num2 < num1); System.out.println(num1 + " " + num2); 

您不必使用parseInt或担心NumberFormatException 。 请注意,由于hasNextXXX方法不会超过任何输入,如果您想跳过“垃圾”,则可能必须调用next() ,如上所示。

相关问题

  • 如果输入错误的类型,如何防止扫描程序抛出exception? (Java)的
  1. 如果num2必须大于num1,则条件num2
  2. 我不知道kb对象是什么,我读了一个String ,然后try Integer.parseInt() ,如果你没有catchexception,那么它是一个数字,如果你这样做,可以读一个新的,也许是通过设置num2到Integer.MIN_VALUE并在您的示例中使用相同类型的逻辑。

这应该工作:

 import java.util.Scanner; public class Test { public static void main(String... args) throws Throwable { Scanner kb = new Scanner(System.in); int num1; System.out.print("Enter number 1: "); while (true) try { num1 = Integer.parseInt(kb.nextLine()); break; } catch (NumberFormatException nfe) { System.out.print("Try again: "); } int num2; do { System.out.print("Enter number 2: "); while (true) try { num2 = Integer.parseInt(kb.nextLine()); break; } catch (NumberFormatException nfe) { System.out.print("Try again: "); } } while (num2 < num1); } } 

尝试这个:

  public static void main(String[] args) { Pattern p = Pattern.compile("^\\d+$"); Scanner kb = new Scanner(System.in); int num1; int num2 = 0; String temp; Matcher numberMatcher; System.out.print("Enter number 1: "); try { num1 = kb.nextInt(); } catch (java.util.InputMismatchException e) { System.out.println("Invalid Input"); // return; } while(num2 

您也可以尝试将字符串解析为int ,但通常人们会尝试避免抛出exception。

我所做的是我定义了一个定义数字的正则表达式, \d表示一个数字。 +符号表示必须有一个或多个数字。 \d前面的额外\是因为在java中, \是一个特殊字符,所以它必须被转义。

我看到Character.isDigit非常适合需要,因为输入只是一个符号。 当然我们没有关于这个kb对象的任何信息,但是如果它是一个java.util.Scanner实例,我还建议使用java.io.InputStreamReader进行命令行输入。 这是一个例子:

 java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); try { reader.read(); } catch(Exception e) { e.printStackTrace(); } reader.close(); 

您可以做的是将下一个标记作为String, 将此字符串转换为char数组并测试数组中的每个字符是否为数字 。

如果您不想处理exception,我认为这是正确的。