背景
今天一个新童鞋发了一段 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年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!