Java IO 之 使用Scanner类读取类型安全的输入

学习在任何交互式Java应用程序中从控制台读取类型安全用户输入,即提示用户直到用户以正确的格式/数据类型输入值。

目录

键入不安全的读取输入方式[不推荐] 
使用控制台从Scanner读取安全的输入方式[推荐]

输入读取内容的输入方式不安全

曾经尝试使用Scanner类在基于交互式控制台的程序中读取用户的输入吗?这是非常简单的代码。您问用户一个问题,用户输入值,然后按Enter。然后使用Scanner.nextXYZ()方法读取值。

让我们看一个使用Scanner类从控制台读取输入的示例。

private static void typeUnsafeReadExample() {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Enter your age as an integer > ");
    
    int age = scanner.nextInt();
    System.out.println("Your age is " + age);
    
    scanner.close();
}
//Output - 1
Enter your age as an integer > 10
Your age is 10
//Output - 2
Enter your age as an integer > ten
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at com.how2codex.examples.TypeSafeInputExample.typeUnsafeReadExample(TypeSafeInputExample.java:19)
    at com.how2codex.examples.TypeSafeInputExample.main(TypeSafeInputExample.java:9)

当用户根据自己的理解键入正确的输入时,由于InputMismatchException异常而使应用程序崩溃。

让我们解决这个用例。

使用扫描仪从控制台读取输入的类型安全方式

从理论上讲,我们可以在阅读之前检查下一个标记是否与我们的预期输入匹配,从而使程序更强大。Scanner.hasNextXYZ()方法做的确切,我们需要在这里。返回true是否可以将下一个标记读取为请求的数据类型。

例如,如果我们期望整数值,则仅当扫描仪中的下一个可用令牌可以解析为整数值时,调用Scanner.hasNextInt()才会返回true。否则它将返回false,我们可以通知用户键入的值无效,并重新提示输入新值。

让我们来看一下使用代码的解决方案。

private static void typeSafeReadExample()
{
    Scanner scanner = new Scanner(System.in);
    System.out.print("Enter your age > ");
    while (!scanner.hasNextInt())
    {
        scanner.nextLine(); //clear the invalid input before prompting again
        System.out.print("Please enter your age in natural positive number > ");
    }
    int age = scanner.nextInt();
    System.out.println("Your age is " + age);
    
    scanner.close();
}
//Output:
Enter your age > ten
Please enter your age in natural positive number > 10.5
Please enter your age in natural positive number > 10
Your age is 10

使用Scanner.hasNextXYZ()Scanner.nextXYZ()方法,我们可以编写任何基于控制台的交互式Java应用程序,在其中我们可以强制用户仅输入有效输入,而不会导致程序崩溃。

saigon has written 1445 articles

One thought on “Java IO 之 使用Scanner类读取类型安全的输入

Leave a Reply