含引用参数交换函数的冒泡排序运行时错误排查与解决
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
相关产品推荐
相关产品推荐

