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

含引用参数交换函数的冒泡排序运行时错误排查与解决

Java Scanner NoSuchElementException 原因、修复及冒泡排序逻辑问题解析

看起来你同时遇到了两个问题:一个是Scanner抛出的NoSuchElementException,另一个是你的冒泡排序逻辑根本不会生效。我来一步步给你拆解:

一、NoSuchElementException 为什么会出现?

这个异常是Scanner.nextInt()触发的,核心原因是:当Scanner尝试读取整数输入,但当前输入流里已经没有更多可读取的内容时,就会抛出这个异常。常见的场景包括:

  • 输入数量不足:比如你先输入了n=5(表示要输入5个数字),但后续只输入了3个数字,程序继续调用nextInt()时就找不到下一个元素了
  • 输入流意外终止:比如在控制台输入时直接按下Ctrl+D(Linux/Mac)或Ctrl+Z(Windows),强行关闭了输入流,导致Scanner无法继续读取
  • 文件重定向输入时,目标文件里的整数数量少于你指定的n值

二、你的冒泡排序逻辑有致命问题

除了Scanner的异常,你的排序代码完全不会生效!因为你用Example类来做交换的操作,本质上只是修改了Example实例里的a属性,原数组arr中的元素根本没有被改动。举个例子:
当你取出arr[i-1]和arr[i]创建a、b两个Example对象,交换这两个对象的a值后,原数组里的arr[i-1]和arr[i]还是原来的数值,等于白忙活了一场。

正确的数组元素交换方式根本不需要额外的类,直接在数组上操作就行:

if(arr[i-1] > arr[i]){
    // 直接交换数组里的元素
    int temp = arr[i-1];
    arr[i-1] = arr[i];
    arr[i] = temp;
    swapped++;
}

三、如何捕获并避免Scanner的这类错误?

有两种实用的方式来处理这类输入异常:

1. 读取前先检查输入有效性

在调用nextInt()之前,先用hasNextInt()判断是否有可用的整数输入,这样可以提前避免异常,还能处理用户输入非整数的情况:

Scanner scan = new Scanner(System.in);
int n;

// 确保用户输入有效的数组长度
while (!scan.hasNextInt()) {
    System.out.println("请输入有效的整数作为数组长度!");
    scan.next(); // 跳过无效的非整数输入
}
n = scan.nextInt();

int[] arr = new int[n];
for(int i = 0; i < n ; i++){
    // 确保每个位置都输入有效的整数
    while (!scan.hasNextInt()) {
        System.out.println("请输入第" + (i+1) + "个有效整数:");
        scan.next(); // 跳过无效输入
    }
    arr[i] = scan.nextInt();
}

2. 使用try-catch块捕获异常

如果需要处理输入流意外结束的场景,可以直接捕获NoSuchElementException和InputMismatchException(处理输入非整数的情况):

Scanner scan = new Scanner(System.in);
int n = 0;

try {
    n = scan.nextInt();
} catch (NoSuchElementException e) {
    System.out.println("输入流已结束,无法读取数组长度!");
    return; // 终止程序或做其他处理
} catch (InputMismatchException e) {
    System.out.println("请输入有效的整数作为数组长度!");
    return;
}

int[] arr = new int[n];
for(int i = 0; i < n ; i++){
    try {
        arr[i] = scan.nextInt();
    } catch (NoSuchElementException e) {
        System.out.println("输入的数字数量不足,已读取" + i + "个数字,程序终止!");
        return;
    } catch (InputMismatchException e) {
        System.out.println("第" + (i+1) + "个输入不是整数,请重新运行程序!");
        return;
    }
}

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:48:13