You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Scanner输入异常求助:多词输入引发程序中断问题

D&D 5E角色表生成器输入问题分析

问题现象

我正在开发一个D&D 5th Edition角色表生成器,需要通过键盘输入依次给String-Int-String类型的变量赋值,然后打印信息。测试时遇到三个问题:

  • 输入多词姓名(如"Gimli Stonehelm")时,控制台抛出InputMismatchException并终止运行;
  • 输入单词语名时程序正常执行;
  • 输入多词阵营(如"Lawful Good")时,仅显示第一个词且程序无报错终止。

相关代码

import java.util.Scanner;

public class FichaPC {
    public static final Scanner keyboard = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("= Character Sheet Generator (D&D 5th Edition) =");
        System.out.println("");
        
        ID_PC();
        }

    
    public static void ID_PC() {
        String name = "";
        int age = 0;
        String align = "";
        
        System.out.print("Name: ");
        name = keyboard.next();
        System.out.print("Age: ");
        age = keyboard.nextInt();
        System.out.print("Alignment: ");
        align = keyboard.next();
        
        System.out.print("Name: ");
        System.out.println(name);
        System.out.print("Age: ");
        System.out.println(age);
        System.out.print("Align: ");
        System.out.println(align);
    }

}

问题根源

所有问题都来自Scanner类的方法特性:

  1. next()的分隔逻辑:next()以空白字符(空格、换行、制表符)为分隔符,只读取到第一个空白前的内容。
    • 输入多词姓名时,name = keyboard.next()只取第一个词,剩下的内容留在输入缓冲区。后续nextInt()尝试把剩余的字符串转成整数,直接触发InputMismatchException。
    • 输入多词阵营时,align = keyboard.next()同样只取第一个词,剩余内容留在缓冲区,但程序已执行完输出逻辑,所以无报错但结果不完整。
  2. nextInt()的遗留换行:nextInt()仅读取整数部分,不会处理输入后的换行符,不过这个问题在当前场景下是次要的,但如果后续用nextLine()会直接读取空行。

解决方案

要读取包含空格的整行输入,改用Scanner.nextLine()方法,它会读取到换行符为止,并清除缓冲区的换行符。注意在nextInt()之后调用nextLine()时,需要先调用一次nextLine()来消耗掉nextInt()遗留的换行符。

修改后的代码:

import java.util.Scanner;

public class FichaPC {
    public static final Scanner keyboard = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("= Character Sheet Generator (D&D 5th Edition) =");
        System.out.println("");
        
        ID_PC();
    }

    public static void ID_PC() {
        String name = "";
        int age = 0;
        String align = "";
        
        System.out.print("Name: ");
        name = keyboard.nextLine(); // 读取整行姓名(含空格)
        System.out.print("Age: ");
        age = keyboard.nextInt();
        keyboard.nextLine(); // 消耗nextInt()留下的换行符
        System.out.print("Alignment: ");
        align = keyboard.nextLine(); // 读取整行阵营(含空格)
        
        System.out.print("Name: ");
        System.out.println(name);
        System.out.print("Age: ");
        System.out.println(age);
        System.out.print("Align: ");
        System.out.println(align);
    }
}

内容的提问来源于stack exchange,提问作者ollie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:32:41