# Java – 使用`Scanner`类读取类型安全输入

> 原文： [https://howtodoinjava.com/java/io/read-typesafe-input-scanner-class/](https://howtodoinjava.com/java/io/read-typesafe-input-scanner-class/)

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

```java
Table of Contents

Type unsafe way of reading input [Not recommended]
Typesafe way of reading input from console using Scanner [Recommended]
```

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

是否曾尝试使用`Scanner`类在基于[交互式控制台的程序](https://howtodoinjava.com/java/io/java-io-how-to-read-input-from-console/)中读取用户的输入？ 这是非常简单的代码。 您问用户一个问题，用户输入值，然后按`Enter`。 然后，您可以使用`Scanner.nextXYZ()`方法读取该值。

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

```java
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.howtodoinjava.examples.TypeSafeInputExample.typeUnsafeReadExample(TypeSafeInputExample.java:19)
	at com.howtodoinjava.examples.TypeSafeInputExample.main(TypeSafeInputExample.java:9)

```

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

让我们解决这个用例。

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

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

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

让我们来看看以上使用代码的解决方案。

```java
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()`](https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html)和`Scanner.nextXYZ()`方法，我们可以编写任何基于控制台的交互式 Java 应用程序，在其中可以强制用户仅输入有效输入-而不会导致程序崩溃。

学习愉快！