Java生成8元素随机整数数组交换最大值与首元素报错排查
问题说明
需要实现的功能:生成长度为8、元素为1-100随机整数的数组,将数组中的最大值与数组首个元素交换。现有代码运行报错,无法完成功能。
原有问题代码:
import java.util.Scanner; import java.util.Random; public class finalExam { public static void main(String []args) { Scanner input = new Scanner(System.in); Random spinner = new Random(); int [] userInputs = new int [8]; for (int i = 0; i < userInputs.length; i++) { userInputs[i] = spinner.nextInt(100)+1; System.out.println(userInputs[i]); } int largest = userInputs[0]; for(int j = 1; j < userInputs.length; j++) { if(userInputs[j] > largest) largest = userInputs[j]; } System.out.println("Your largest number is: " + largest); int holder; int [] arr = new int[101]; for (int m = 0; m <= arr.length; m++) { holder = largest; userInputs[0] = userInputs[largest]; holder = userInputs[0]; } } }
错误原因
代码共有3个核心问题,直接导致运行报错、功能失效:
- 找最大值时只保存了最大值的数值,没有保存最大值在数组里的索引位置。后续交换时直接把最大值的数值当下标访问数组,而数组长度只有8(合法下标范围0-7),随机生成的最大值是1-100的数,只要值大于7就会触发数组下标越界异常。
- 交换逻辑完全错误:多余创建了长度为101的
arr数组,这个数组从头到尾没被用到;循环条件写为m <= arr.length,数组长度为101时合法下标最大是100,循环跑到m=101时本身就会触发越界;循环内的赋值逻辑完全混乱,根本没有完成两个元素值的互换。 - 导入并初始化的
Scanner对象全程没有使用,属于冗余代码。
修复后代码
import java.util.Random; public class finalExam { public static void main(String []args) { Random spinner = new Random(); int [] userInputs = new int [8]; // 生成8个1-100的随机数存入数组,逐行打印原始数组 for (int i = 0; i < userInputs.length; i++) { userInputs[i] = spinner.nextInt(100) + 1; System.out.println(userInputs[i]); } // 遍历数组,同时记录最大值和最大值对应的下标 int largest = userInputs[0]; int largestIndex = 0; for(int j = 1; j < userInputs.length; j++) { if(userInputs[j] > largest) { largest = userInputs[j]; largestIndex = j; } } System.out.println("Your largest number is: " + largest); // 标准值交换逻辑:临时变量存首元素原值,完成首元素和最大值位置的互换 int temp = userInputs[0]; userInputs[0] = userInputs[largestIndex]; userInputs[largestIndex] = temp; // 打印交换后的数组,方便验证结果 System.out.println("交换完成后的数组:"); for (int num : userInputs) { System.out.println(num); } } }
修复说明
- 移除了未使用的
Scanner相关冗余代码 - 遍历查找最大值时新增
largestIndex变量,专门存最大值所在的数组下标,从根源上避免下标越界问题 - 删除了无意义的
arr数组和错误循环,使用标准的两值交换逻辑完成元素互换,逻辑清晰不会出错 - 增加了交换后数组的打印逻辑,运行时可以直接看到结果是否符合预期
内容的提问来源于stack exchange,提问作者Master Oogie
相关产品推荐
相关产品推荐

