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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:06