当我测试这段代码时,它给了我java.lang.ArrayIndexOutOfBoundsException:2 代码还没有完成,但这正是我想要做的: 一个程序,询问用户两个数字。打印较小的所有数字 以随机顺序编号为较大的数字(包括)。使用此订单,找到 彼此相邻的2个数字的最大总和。 有些人可以指出我需要修复什么以及如何修复它?感谢。
boolean isNum = false;
int in1 = 0;
int in2 = 0;
int size = 0;
int largestsum = 0;
while (!isNum) {
try {
System.out.print("Enter a number: ");
in1 = Integer.parseInt(in.readLine());
boolean isSame = false;
while (!isSame) {
System.out.print("Enter a number: ");
try {
in2 = Integer.parseInt(in.readLine());
if (in1 != in2) {
isSame = true;
} else {
System.out.println("Same number.");
}
} catch (NumberFormatException nfe) {
System.out.println("Not a number.");
}
}
isNum = true;
} catch (NumberFormatException nfe) { //catches error
System.out.println("Not a number."); //informs user of the error
}
}
if (in1 > in2) {
size = in1 - in2 + 1;
int[] num = new int[size];
for (int i = 0; i < size; i++) {
num[i] = in2 + i;
}
int[] order = new int[size];
boolean[] used = new boolean[size];
for (int i = 0; i < size; i++) {
int r = (int) ((size) * (Math.random()));
while (used[r]) {
r = (int) ((size) * Math.random());
}
order[i] = r; //fill array
used[r] = true; //r is now used
}
for (int i = 0; i < size; i++) {
if (num[order[i]] + num[order[i + 1]] > largestsum) {
largestsum = num[order[i]] + num[order[i + 1]];
}
}
答案 0 :(得分:1)
我的猜测是你的最后一个循环问题。由于order
可以包含从0
到size
的值,num[order[i]]
始终有效,但在order[i]==size
,num[order[i+1]]
出来的情况下边界。
答案 1 :(得分:1)
当i = size-1
时,最后一个 for 循环将溢出在您的问题中,您希望获得两个相邻数字之间的总和。您在上一个 for 循环中的逻辑表示您通过将数字 i 添加到 i + 1 来计算总和。数组中的最后一项位于 size-1 位置,因此当您尝试将其添加到下一个相邻的数字时,(size-1)+1 会溢出阵列。
要解决此问题,您的最后一个for循环应该只会继续,直到 i&lt; size-1 ,就像这样......
for (int i = 0; i < size-1; i++) {
if (num[order[i]] + num[order[i + 1]] > largestsum) {
largestsum = num[order[i]] + num[order[i + 1]];
}
}
使用此固定逻辑, for 循环中的最大项目是 size-2 ,当您向其添加1(对于下一个相邻的数字)时,它将选择(size-2)+1 项,这是数组中的最后一项,而不是溢出数组。