Scanner输入引发NumberFormatException及字段输入异常求助
解决Scanner输入导致的NumberFormatException和字段输入跳过问题
你遇到的这两个问题,本质都是Scanner输入流里残留的换行符在搞鬼,我来帮你拆解原因并给出修复方案:
问题根源分析
1. NumberFormatException的触发原因
你的takeTableName()方法用了next()获取表名,next()只会读取到空格/换行前的内容,当你输入完表名按下回车后,输入流里会留下一个\n换行符。进入takeFieldName()调用sc.nextLine()时,它会先读取这个残留的空字符串,Integer.parseInt("")自然就抛出NumberFormatException了。
2. 使用nextInt()时字段输入跳过的原因
nextInt()同样只会读取数字本身,不会处理后面的换行符。当你输入2并回车后,换行符留在输入流里,第一次循环的sc.nextLine()会直接读取这个换行符,导致field1被自动填充为空,直接跳到field2的输入环节。
修复方案
这里提供两种可靠的修复方式,你可以根据习惯选择:
方案一:统一使用nextLine()处理所有输入(推荐)
把所有输入都用nextLine()读取,再按需转换类型,能彻底避免换行符残留问题,还能顺便做输入合法性校验:
// 注意:Scanner实例应该全局复用,不要在方法内重复创建 private static Scanner sc = new Scanner(System.in); public static String takeFieldName() { String fullfield = ""; System.out.println("Enter number of fields: "); // 循环确保输入有效的正整数 int nofields = 0; while (true) { String input = sc.nextLine().trim(); // 去除前后空格,避免误判空输入 try { nofields = Integer.parseInt(input); if (nofields > 0) break; // 确保字段数量是正整数 System.out.println("请输入大于0的数字:"); } catch (NumberFormatException e) { System.out.println("输入无效,请输入整数:"); } } String[] fname = new String[nofields]; System.out.println("Specify fields with names"); for(int i=0;i<fname.length;i++) { System.out.println("Enter field :"+(i+1)); fname[i] = sc.nextLine().trim(); // 去除空格,避免空字段 } System.out.println("Fields are:"); for(String s:fname) { System.out.println(s); } return UserDAO.toCSV(fname); }
方案二:使用nextInt()后手动跳过换行符
如果你坚持用nextInt()读取数字,必须在读取后手动跳过残留的换行符:
private static Scanner sc = new Scanner(System.in); public static String takeFieldName() { String fullfield = ""; System.out.println("Enter number of fields: "); int nofields = sc.nextInt(); sc.nextLine(); // 关键:跳过nextInt()后残留的换行符 String[] fname = new String[nofields]; System.out.println("Specify fields with names"); for(int i=0;i<fname.length;i++) { System.out.println("Enter field :"+(i+1)); fname[i] = sc.nextLine(); } System.out.println("Fields are:"); for(String s:fname) { System.out.println(s); } return UserDAO.toCSV(fname); }
额外注意事项
- 不要在方法内重复创建
Scanner实例(比如你注释掉的Scanner sc = new Scanner(System.in);),全局使用一个实例即可,否则会导致输入流混乱。 - 建议对用户输入做合法性校验(比如方案一中的循环判断),避免非法输入直接导致程序崩溃。
内容的提问来源于stack exchange,提问作者Mars_rider
相关产品推荐
相关产品推荐

