Java 一个 Scanner.nextInt 造成的奇怪问题及分析解决过程

image

背景

今天一个新童鞋发了一段 Java 代码让我帮他看,同时他描述了问题情况:

当输入了要输入要排序字符的个数之后,比如输入 5,接着就会连续打印出 “请输入第1个要排序的字符:” 和 “请输入第2个要排序的字符:” 两条消息。

代码如下:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要排序字符的个数:");
        int zfgs = sc.nextInt();                                            //用户输入要排序字符个数
        String[] zfsz = new String[zfgs];
        for (int i = 0; i < zfsz.length; i++) {
            System.out.println("请输入第" +( i + 1) + "个要排序的字符:");
            String yhsr1 = sc.nextLine();                                   //用户输入要排序字符内容
            zfsz[i] = yhsr1;
        }
        pdzfcd(zfsz);
    }
    public static void pdzfcd(String[] zfsz) {                              //判断数组字符长度排序方法
        Arrays.sort(zfsz, Comparator.comparingInt(String::length));
        System.out.println("字符从短到长排序如下:");
        for (String str : zfsz) {

            System.out.println(str);
        }
    }
}

代码咋一看没有问题,但运行起来确实如他所说。那么问题究竟出在哪里呢?

分析

既然问题表现在循环代码中,那么首先把这两个代码注释掉并改为新的,看看纯粹的循环代码有没有问题:

// int zfgs = sc.nextInt(); 
// String[] zfsz = new String[zfgs];

String[] zfsz = new String[5];

改完后重新运行代码,程序正常依次输出 “请输入第…” 的提示和等待输入,

那么原因很清晰了,就是这一行代码 int zfgs = sc.nextInt(); 造成的问题。

为什么 sc.nextInt() 会有问题呢?

原来这是因为在使用 Scanner 读取整数输入后,接下来的 nextLine() 调用会读取到上次输入后的换行符,而不是等待用户输入新的字符串。

明白了原因,就很容易解决了,在读取整数后调用一次 nextLine(),消耗掉输入的换行符就可以了。

修改后的代码

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要排序字符的个数:");
        int zfgs = sc.nextInt();    // 用户输入要排序字符个数
        sc.nextLine();              // 消耗掉换行符
        
        String[] zfsz = new String[zfgs];
        for (int i = 0; i < zfsz.length; i++) {
            System.out.println("请输入第" + (i + 1) + "个要排序的字符:");
            String yhsr1 = sc.nextLine();  // 用户输入要排序字符内容
            zfsz[i] = yhsr1;
        }
        pdzfcd(zfsz);
    }

    public static void pdzfcd(String[] zfsz) {  // 判断数组字符长度排序方法
        Arrays.sort(zfsz, Comparator.comparingInt(String::length));
        System.out.println("字符从短到长排序如下:");
        for (String str : zfsz) {
            System.out.println(str);
        }
    }
}

运行修改后的代码,一切正常!

最后

问题比较简单,但背后的知识点却不简单,是一个新手比较容易碰到而不容易解决的问题,所以记录一下,以期能帮助到其他碰到这个问题的朋友。

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值