杰瑞科技汇

Java输入字符Scanner如何正确使用?

核心方法

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

Java输入字符Scanner如何正确使用?-图1
(图片来源网络,侵删)
方法 描述 示例
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:读取一行文本中的第一个字符

这个例子会读取用户输入的一整行,然后取该行的第一个字符。

Java输入字符Scanner如何正确使用?-图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);

问题分析:

  1. 当你输入 20 并按回车时,nextInt() 读取了数字 20
  2. 回车符 \n 并没有被消耗掉,它仍然留在输入缓冲区中。
  3. 当程序执行到 nextLine() 时,它会立刻读取这个残留的回车符,然后认为一行已经结束了。
  4. name 变量的值是一个空字符串 ,程序不会等待你输入名字。

解决方案:

在调用 nextInt()nextDouble() 等读取基本类型的方法后,如果你后面要调用 nextLine(),最好先“消耗掉”那个残留的换行符。

Java输入字符Scanner如何正确使用?-图3
(图片来源网络,侵删)

修正后的代码:

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-catchif 判断来增加程序的健壮性是一个好习惯。


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 中的字符输入了。

分享:
扫描分享到社交APP
上一篇
下一篇