背景
今天一个新童鞋发了一段 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()
会有问题呢?
明白了原因,就很容易解决了,在读取整数后调用一次 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年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!