Appearance
16.4 Scanner 键盘输入
Scanner 类的概念
Scanner 类是 Java 中用于获取用户输入的类,位于 java.util 包中。它可以从各种输入源读取数据,如键盘、文件等。
Scanner 类的使用
创建 Scanner 对象
java
import java.util.Scanner;
// 创建从键盘读取输入的 Scanner 对象
Scanner scanner = new Scanner(System.in);读取不同类型的输入
读取字符串
java
// 读取一行字符串
String line = scanner.nextLine();
// 读取一个单词(以空格为分隔符)
String word = scanner.next();读取整数
java
// 读取整数
int num = scanner.nextInt();
// 读取长整数
long longNum = scanner.nextLong();读取浮点数
java
// 读取浮点数
float floatNum = scanner.nextFloat();
// 读取双精度浮点数
double doubleNum = scanner.nextDouble();读取布尔值
java
// 读取布尔值(true 或 false)
boolean bool = scanner.nextBoolean();检查输入
java
// 检查是否有下一个输入
boolean hasNext = scanner.hasNext();
// 检查是否有下一个整数
boolean hasNextInt = scanner.hasNextInt();
// 检查是否有下一个浮点数
boolean hasNextDouble = scanner.hasNextDouble();关闭 Scanner
java
// 使用完毕后关闭 Scanner
scanner.close();示例:Scanner 类的应用
示例 1:读取用户输入的字符串
java
import java.util.Scanner;
public class ReadStringExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的名字: ");
String name = scanner.nextLine();
System.out.println("你好, " + name + "!");
scanner.close();
}
}示例 2:读取用户输入的整数
java
import java.util.Scanner;
public class ReadIntExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数: ");
int num = scanner.nextInt();
System.out.println("你输入的整数是: " + num);
System.out.println("该整数的平方是: " + (num * num));
scanner.close();
}
}示例 3:读取多个输入
java
import java.util.Scanner;
public class ReadMultipleInputsExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的名字: ");
String name = scanner.nextLine();
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt();
System.out.print("请输入你的身高(米): ");
double height = scanner.nextDouble();
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("身高: " + height + " 米");
scanner.close();
}
}示例 4:使用 hasNext 检查输入
java
import java.util.Scanner;
public class CheckInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数: ");
while (!scanner.hasNextInt()) {
System.out.println("输入错误,请输入一个整数: ");
scanner.next(); // 消费无效输入
}
int num = scanner.nextInt();
System.out.println("你输入的整数是: " + num);
scanner.close();
}
}示例 5:读取多行输入
java
import java.util.Scanner;
public class ReadMultipleLinesExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入多行文本,输入 'exit' 结束:");
String line;
while (!(line = scanner.nextLine()).equals("exit")) {
System.out.println("你输入的是: " + line);
}
System.out.println("输入结束");
scanner.close();
}
}常见问题
1. nextLine() 跳过输入
症状:使用 nextInt()、nextDouble() 等方法后,nextLine() 跳过了用户输入
解决方案:在 nextInt() 等方法后,使用一个额外的 nextLine() 来消费换行符
示例:
java
import java.util.Scanner;
public class NextLineIssueExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数: ");
int num = scanner.nextInt();
// 消费换行符
scanner.nextLine();
System.out.print("请输入一个字符串: ");
String str = scanner.nextLine();
System.out.println("整数: " + num);
System.out.println("字符串: " + str);
scanner.close();
}
}2. 输入类型不匹配
症状:用户输入的类型与预期不符,导致程序崩溃
解决方案:使用 hasNextXxx() 方法检查输入类型
示例:
java
import java.util.Scanner;
public class InputTypeCheckExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数: ");
while (!scanner.hasNextInt()) {
System.out.print("输入错误,请输入一个整数: ");
scanner.next(); // 消费无效输入
}
int num = scanner.nextInt();
System.out.println("你输入的整数是: " + num);
scanner.close();
}
}3. 资源泄漏
症状:Scanner 未关闭,导致资源泄漏
解决方案:使用 try-with-resources 语句自动关闭 Scanner
示例:
java
// 错误:未关闭 Scanner
// Scanner scanner = new Scanner(System.in);
// // 使用 scanner
// 正确:使用 try-with-resources
import java.util.Scanner;
public class AutoCloseScannerExample {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
System.out.print("请输入你的名字: ");
String name = scanner.nextLine();
System.out.println("你好, " + name + "!");
} // scanner 自动关闭
}
}最佳实践
使用 try-with-resources:自动关闭 Scanner,避免资源泄漏
检查输入类型:使用 hasNextXxx() 方法检查输入类型,避免输入类型不匹配导致的程序崩溃
处理换行符问题:在使用 nextInt() 等方法后,使用额外的 nextLine() 来消费换行符
提供清晰的提示:为用户提供清晰的输入提示,说明需要输入什么类型的数据
处理无效输入:当用户输入无效时,给出友好的错误提示,并允许用户重新输入
限制输入长度:对于需要限制长度的输入,进行适当的检查和处理
总结
Scanner 类是 Java 中用于获取用户输入的重要工具类:
基本用法:
- 创建 Scanner 对象
- 使用各种 nextXxx() 方法读取不同类型的输入
- 使用 hasNextXxx() 方法检查输入类型
- 使用完毕后关闭 Scanner
常见问题:
- nextLine() 跳过输入
- 输入类型不匹配
- 资源泄漏
最佳实践:
- 使用 try-with-resources 自动关闭 Scanner
- 检查输入类型
- 处理换行符问题
- 提供清晰的提示
- 处理无效输入
通过合理使用 Scanner 类,可以方便地获取用户输入,实现交互式程序。
