核心方法
Scanner 类提供了几个方法来读取字符,它们之间有细微但重要的区别:

| 方法 | 描述 | 示例 |
|---|---|---|
next() |
读取下一个单词(以空格为分隔符),它返回一个 String。 |
Scanner scanner = new Scanner(System.in); String word = scanner.next(); |
nextLine() |
读取一整行文本(以回车 \n 为分隔符),它返回一个 String。 |
Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); |
next().charAt(0) |
最常用的获取单个字符的方法,先读取一个单词,然后取该单词的第一个字符。 | Scanner scanner = new Scanner(System.in); char c = scanner.next().charAt(0); |
findInLine(".") |
在当前行中查找下一个匹配指定模式的字符( 代表任意单个字符),返回一个 MatchResult,需要调用 group() 获取字符。 |
Scanner scanner = new Scanner(System.in); scanner.findInLine("."); char c = scanner.match().group().charAt(0); |
- 如果你想读取用户输入的第一个字符(无论后面有没有空格),最简单、最常用的方法是
scanner.next().charAt(0)。 - 如果你想读取一整行文本,然后从中取字符,应该用
scanner.nextLine()。 next()方法在读取时会跳过所有空白字符(空格、Tab、回车等),直到遇到一个非空白字符为止。
完整代码示例
下面是一个完整的、可运行的 Java 程序,演示了如何使用 Scanner 来输入字符。
示例 1:读取单个字符(最常用)
这个例子会提示用户输入一个字符,然后打印出来。
import java.util.Scanner; // 1. 导入 Scanner 类
public class ReadCharExample {
public static void main(String[] args) {
// 2. 创建一个 Scanner 对象,关联标准输入流 System.in
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个字符: ");
// 3. 使用 next() 读取一个单词,再用 charAt(0) 获取第一个字符
// 注意:如果用户直接按回车,没有输入任何内容,next() 会抛出 InputMismatchException
try {
char ch = scanner.next().charAt(0);
System.out.println("你输入的字符是: " + ch);
} catch (Exception e) {
System.out.println("输入无效,请确保输入了至少一个字符。");
}
// 4. 关闭 Scanner,释放资源(非常重要!)
scanner.close();
}
}
运行示例:
请输入一个字符: A
你输入的字符是: A
示例 2:读取一行文本中的第一个字符
这个例子会读取用户输入的一整行,然后取该行的第一个字符。

import java.util.Scanner;
public class ReadLineCharExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一行文本,然后按回车: ");
// 1. 使用 nextLine() 读取整行
String line = scanner.nextLine();
// 2. 检查行是否为空,避免 StringIndexOutOfBoundsException
if (line.isEmpty()) {
System.out.println("你没有输入任何内容。");
} else {
// 3. 从字符串中获取第一个字符
char firstChar = line.charAt(0);
System.out.println("你输入行的第一个字符是: " + firstChar);
}
scanner.close();
}
}
运行示例:
请输入一行文本,然后按回车: Hello World
你输入行的第一个字符是: H
重要注意事项和常见问题
问题 1:nextLine() 的“换行符残留”问题
这是一个非常经典且容易出错的问题,请看下面的代码:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt(); // 读取整数
System.out.print("请输入你的名字: ");
String name = scanner.nextLine(); // 读取名字
System.out.println("年龄: " + age + ", 名字: " + name);
问题分析:
- 当你输入
20并按回车时,nextInt()读取了数字20。 - 回车符
\n并没有被消耗掉,它仍然留在输入缓冲区中。 - 当程序执行到
nextLine()时,它会立刻读取这个残留的回车符,然后认为一行已经结束了。 name变量的值是一个空字符串 ,程序不会等待你输入名字。
解决方案:
在调用 nextInt()、nextDouble() 等读取基本类型的方法后,如果你后面要调用 nextLine(),最好先“消耗掉”那个残留的换行符。

修正后的代码:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的年龄: ");
int age = scanner.nextInt();
// 添加这行代码来消耗掉换行符
scanner.nextLine();
System.out.print("请输入你的名字: ");
String name = scanner.nextLine();
System.out.println("年龄: " + age + ", 名字: " + name);
scanner.close();
运行示例:
请输入你的年龄: 20
请输入你的名字: 张三
年龄: 20, 名字: 张三
问题 2:处理异常
如果用户直接按回车,scanner.next() 会抛出 InputMismatchException,如果对一个空字符串使用 charAt(0),会抛出 StringIndexOutOfBoundsException,使用 try-catch 或 if 判断来增加程序的健壮性是一个好习惯。
Java 9+ 的改进:Scanner.tokens()
从 Java 9 开始,Scanner 引入了一个新的方法 tokens(),它返回一个 Stream<String>,这在处理输入流时更加灵活和现代化。
import java.util.Scanner;
import java.util.stream.Stream;
public class ScannerTokensExample {
public static void main(String[] args) {
Scanner scanner = new Scanner("apple banana cherry");
// tokens() 返回一个流,其中每个元素都是输入中的一个单词
Stream<String> words = scanner.tokens();
// 可以对流进行操作,forEach
words.forEach(word -> System.out.println("单词: " + word));
scanner.close();
}
}
运行结果:
单词: apple
单词: banana
单词: cherry
虽然这个例子不直接用于交互式输入,但它展示了 Scanner 处理文本的强大能力,对于交互式输入,你可以结合 while (scanner.hasNext()) 来使用。
| 需求 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 读取单个字符 | scanner.next().charAt(0) |
简单直接,跳过前导空格 | 如果用户直接回车会抛出异常 |
| 读取一行文本 | scanner.nextLine() |
读取整行,包含空格 | 容易与 nextInt() 等方法产生换行符冲突 |
| 从一行中取字符 | String line = scanner.nextLine(); line.charAt(0) |
灵活,可以获取任意位置的字符 | 需要检查字符串是否为空 |
对于初学者来说,scanner.next().charAt(0) 是获取单个字符的首选方法,并牢记 nextLine() 和 nextInt() 配合使用时的“换行符陷阱”,就能很好地处理 Java 中的字符输入了。
