You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何正确捕获并排序用户输入的5个数字?

Java 整数输入与排序问题解决方案

修正后的完整代码

import java.util.InputMismatchException;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            int[] arr = new int[5];
            System.out.println("请输入5个整数(可通过空格或回车分隔):");
            
            // 带验证的输入捕获
            int inputCount = 0;
            while (inputCount < 5) {
                try {
                    arr[inputCount] = scanner.nextInt();
                    inputCount++;
                } catch (InputMismatchException e) {
                    System.out.println("输入无效,请输入整数:");
                    scanner.next(); // 清除无效输入,避免死循环
                }
            }

            // 显示未排序数组
            System.out.print("排序前数组:");
            printArray(arr);

            // 插入排序(升序)
            insertionSortAsc(arr);

            // 显示排序后数组
            System.out.print("\n排序后数组:");
            printArray(arr);
        }
    }

    // 封装数组打印逻辑,避免重复代码
    private static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }

    // 封装插入排序逻辑,代码更清晰
    private static void insertionSortAsc(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int key = arr[i];
            int j = i - 1;
            // 升序排序:将比key大的元素后移
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }
}

问题逐个解析

1. 输入处理问题

你的原代码中Scanner.nextInt()的逻辑本身正确,但缺少输入验证和异常处理:

  • 当用户输入非整数时,会抛出InputMismatchException导致程序崩溃
  • 若输入数量不足,程序会一直阻塞等待输入

修正方案:

  • 添加try-catch捕获输入类型异常
  • 用循环计数确保获取到5个有效整数
  • 用scanner.next()清除无效输入,避免死循环

2. 排序逻辑问题

你实现的插入排序代码是正确的升序排序逻辑,如果结果不符合预期:

  • 若需要降序排序,只需将while (j >= 0 && arr[j] > key)改为while (j >= 0 && arr[j] < key)
  • 检查测试用例:比如输入5 4 3 2 1,排序后应为1 2 3 4 5,可手动验证逻辑正确性

3. 输出重复问题

从你提供的代码来看,已经正确完成了「输入→打印未排序数组→排序→打印排序后数组」的流程,没有重复输入操作。若之前版本存在重复,只需确保输入捕获仅执行一次,排序操作在输入完成后执行即可。


Scanner 使用技巧与最佳实践

  • 强制使用try-with-resources:自动关闭Scanner,避免资源泄漏(你已正确使用)
  • 必须处理输入异常:捕获InputMismatchException并清理无效输入,保证程序健壮性
  • 明确输入提示:告知用户输入格式(如空格/回车分隔),减少用户困惑
  • 封装重复逻辑:将数组打印、排序等操作封装为独立方法,提升代码可读性
  • 避免nextInt()与nextLine()混用:nextInt()不会读取换行符,后续调用nextLine()会读取空字符串,需先用scanner.nextLine()消耗换行符

内容的提问来源于stack exchange,提问作者pomoworko.com

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:37:05