编程小记2 Java输入方法next()的错误

一、前提

        在 Java 项目开发中,Scanner 是我们处理用户输入的常用工具,尤其在控制台应用程序中。
然而,你是否遇到过以下这些问题:

  • 输入被跳过:调用 nextInt 后直接使用 nextLine,结果下一个输入没机会写就被跳过。
  • 非法输入导致崩溃:输入字母或符号时,程序直接报错。
  • 空格和换行符困扰:输入中多余的空格或换行符常常造成意料之外的行为。

最近,我在开发一个学生管理系统时,完美地踩中了这些坑!以下是我的问题代码:


二、问题代码分析

1.具体代码

在学生管理系统的功能选择菜单中,我用以下代码实现了基本的增删改查:

do {
    System.out.println("----------------------------------------------------------------");
    System.out.println("请输入所需要的功能:1:查找  2:删除  3:添加  4:修改  5:查看全部");
    System.out.println("----------------------------------------------------------------");
    
    Scanner scan = new Scanner(System.in);
    
    int index = scan.nextInt(); // 输入数字操作编号

    switch (index) {
        case 1: // 查找功能
            System.out.println("请输入要查找的team的id");
            int id = scan.nextInt();
            // ... 省略其他逻辑
            break;
        case 3: // 添加功能
            System.out.println("请输入要添加的team的name");
            String name = scan.next();
            // ... 省略其他逻辑
            break;
    }
} while (true);

表面上看这段代码似乎没问题,但运行时问题却接踵而至:

(1)跳过输入问题

        当用户输入完一个整数后,直接输入字符串会发现程序“自动跳过”某些输入环节。例如:

输入所需要的功能:3
请输入要添加的team的name:
// 什么都没输入就跳到了下一步

(2)原因分析

   nextInt 读取了数字,但换行符(\n)还留在输入流中,next()nextLine() 会直接读取这个换行符。

(3)非法输入问题

        如果用户误输入了非数字(例如输入字母 a):

Exception in thread "main" java.util.InputMismatchException

程序直接抛异常崩溃。

(4)输入清理问题

        用户输入前后多余空格时,系统可能会错误处理。


三、解决方案

要解决这些问题,我们需要从以下几个方面优化代码:

1. 统一使用 nextLine() 读取输入

  • nextLine 会读取整行输入,包括换行符,避免输入被跳过的问题。
  • 数字输入时,配合 Integer.parseInt() 将字符串转换为整数。

2. 添加异常处理

  • 使用 try-catch 捕获非法输入,防止程序因输入错误崩溃。

3. 清理输入

  • 调用 trim() 去掉前后多余空格,确保输入的整洁性。

四、修改后的代码

do {
    System.out.println("--------------------------------------------------------------");
    System.out.println("请输入所需要的功能:1:查找  2:删除  3:添加  4:修改  5:查看全部");
    System.out.println("--------------------------------------------------------------");

    Scanner scan = new Scanner(System.in);

    try {
        int index = Integer.parseInt(scan.nextLine().trim()); // 使用 nextLine 读取整行,转为整数

        switch (index) {
            case 1: // 查找功能
                System.out.println("请输入要查找的team的id:");
                int id = Integer.parseInt(scan.nextLine().trim());
                // ... 查找逻辑
                break;

            case 3: // 添加功能
                System.out.println("请输入要添加的team的name:");
                String name = scan.nextLine().trim();
                // ... 添加逻辑
                break;

            default:
                System.out.println("输入的指令无效,请重新输入!");
        }
    } catch (NumberFormatException e) {
        System.out.println("输入无效,请输入正确的数字!");
    }
} while (true);

五、代码亮点解析

1. 避免跳过输入

通过统一使用 nextLine,确保每次都读取用户完整的输入,避免了换行符残留问题。

2. 处理非法输入

添加 try-catch 语句捕获用户输入非数字时的异常,程序不会因用户错误崩溃。

3. 提升用户体验

在读取输入后调用 trim(),让用户输入的多余空格不影响程序逻辑。


六、测试效果

1.输入被跳过问题:

(1)修复前:        

请输入所需要的功能:3 请输入要添加的team的name:

直接跳过输入。

(2)修复后:

请输入所需要的功能:3 请输入要添加的team的name: 学生管理团队

完美解决,程序按预期继续执行。


六、总结

  • Scanner 是处理用户输入的利器,但需要注意其不同方法的行为差异。
  • 为了避免跳过输入或程序崩溃,建议统一使用 nextLine,并通过类型转换和异常处理增强代码健壮性。
  • 此外,trim 等输入清理方法能提升用户输入的容错性和代码质量。

希望这篇博客能帮你在实际开发中避免输入相关的坑!你还有其他关于 Java 入门的问题吗?欢迎评论区交流! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值