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类的方法特性:
next()的分隔逻辑:next()以空白字符(空格、换行、制表符)为分隔符,只读取到第一个空白前的内容。- 输入多词姓名时,
name = keyboard.next()只取第一个词,剩下的内容留在输入缓冲区。后续nextInt()尝试把剩余的字符串转成整数,直接触发InputMismatchException。 - 输入多词阵营时,
align = keyboard.next()同样只取第一个词,剩余内容留在缓冲区,但程序已执行完输出逻辑,所以无报错但结果不完整。
- 输入多词姓名时,
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
相关产品推荐
相关产品推荐

