Java中Scanner输入异常:无法读取title且cost输入报错求助
问题原因与解决方法
核心问题分析
- title被跳过:
kb.nextInt()仅读取输入的整数部分,输入完成后按下的回车键(换行符)会留在输入缓冲区中,后续的kb.nextLine()会直接读取这个空换行符,导致title被赋值为空字符串,程序跳过输入提示直接进入category环节。 - cost输入异常:若前面的换行符未处理干净,
kb.nextFloat()可能读取到非预期字符(如残留换行)引发转换失败;另外如果输入时用逗号(如12,3)而非英文小数点(12.3)作为小数分隔符,也会触发异常。
解决方法
方法一:手动消费残留换行符
在调用nextInt()这类非整行读取方法后,额外调用一次kb.nextLine()清空缓冲区里的换行符:
package ChuoiTrongJava; import java.util.Scanner; public class IndexOf { public static void main(String[] args) { Scanner kb = new Scanner(System.in); System.out.print("ID: "); int id = kb.nextInt(); kb.nextLine(); // 消费ID输入后的换行符 System.out.print("\nTitle: "); String title = kb.nextLine(); System.out.print("\nCategory: "); String category = kb.nextLine(); System.out.print("\nCost: "); Float cost = kb.nextFloat(); // 验证输入结果 System.out.println("\n已输入内容:"); System.out.println("ID: " + id); System.out.println("Title: " + title); System.out.println("Category: " + category); System.out.println("Cost: " + cost); } }
方法二:统一用nextLine()读取所有输入(更推荐)
这种方式彻底避免缓冲区残留问题,同时能更灵活处理输入场景:
package ChuoiTrongJava; import java.util.Scanner; public class IndexOf { public static void main(String[] args) { Scanner kb = new Scanner(System.in); System.out.print("ID: "); int id = Integer.parseInt(kb.nextLine()); // 读取整行后转换为int System.out.print("\nTitle: "); String title = kb.nextLine(); System.out.print("\nCategory: "); String category = kb.nextLine(); System.out.print("\nCost: "); Float cost = Float.parseFloat(kb.nextLine()); // 读取整行后转换为float // 验证输入结果 System.out.println("\n已输入内容:"); System.out.println("ID: " + id); System.out.println("Title: " + title); System.out.println("Category: " + category); System.out.println("Cost: " + cost); } }
额外注意事项
- 输入cost时必须使用英文小数点(
.)作为小数分隔符,例如输入29.99而非29,99,否则会触发转换异常。 - 若要处理用户输入错误的情况(比如输入非整数的ID),可以添加
try-catch块捕获异常,提升程序健壮性。
内容的提问来源于stack exchange,提问作者Comet
相关产品推荐
相关产品推荐

