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

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

背景

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


相关文章
|
5月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
241 15
常见java OOM异常分析排查思路分析
|
4月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
112 1
|
28天前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
49 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
28天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
38 5
|
28天前
|
人工智能 自然语言处理 搜索推荐
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
51 5
|
28天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
41 5
|
28天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
75 4
|
28天前
|
Java 数据库连接 数据库
【潜意识Java】使用 Ruoyi 框架开发企业级应用,从零开始的实践指南和分析问题
本文介绍了基于Spring Boot的开源企业级框架Ruoyi,涵盖环境搭建、项目初始化及用户管理模块的创建。
122 4
|
28天前
|
SQL Java API
|
28天前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
60 1

热门文章

最新文章