运行-处理数组和冒泡排序时的时间错误 (Java)
Run-time error when handling arrays and a bubble sort (Java)
我最近被指派为数字列表创建冒泡排序(您将在我将要向您展示的代码中找到该列表),但是,尽管程序编译得很好,但我总是得到这个运行-cmd 中的时间错误...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at hw.main(hw.java:17)
这是我目前的情况。
//Ch 9 HW 7
class hw
{
public static void main(String[] args)
{
int[] x = new int[10];
x[0] = 100;
x[1] = 23;
x[2] = 15;
x[3] = 23;
x[4] = 7;
x[5] = 23;
x[6] = 2;
x[7] = 311;
x[8] = 5;
x[9] = 8;
x[10] = 3;
System.out.println(bubbleSort(x));
}
public static int[] bubbleSort(int[] x)
{
int placehold = 0;
for (int i = 0; i < x.length; i++)
{
if (x[i] > x[i + 1])
{
placehold = x[i + 1];
x[i] = x[i + 1];
x[i + 1] = placehold;
}
}
return x;
}
}
我想知道你们是否可以给我一个错误的解释和修复它的方法。非常感谢
~安德鲁
编辑:
此代码为 "Arrays"
提供了 "cannot find symbol" 错误
//Ch 9 HW 7
class hw
{
public static void main(String[] args)
{
int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
String y = Arrays.toString(bubbleSort(x));
System.out.println(y);
}
public static int[] bubbleSort(int[] x)
{
int placehold = 0;
for (int i = 0; i < x.length - 1; i++)
{
if (x[i] > x[i + 1])
{
placehold = x[i + 1];
x[i] = x[i + 1];
x[i + 1] = placehold;
}
}
return x;
}
}
最终编辑及更正:
这是给那些好奇的人的正确代码。
//Andrew Mancinelli
import java.util.*;
class hw
{
public static void main(String[] args)
{
int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
String y = Arrays.toString(bubbleSort(x));
System.out.println(y);
}
public static int[] bubbleSort(int[] x)
{
for (int start = 0; start < x.length - 1; start++)
{
int min = x[start];
int indexMin = start;
for (int j = start + 1; j < x.length; j++)
{
if (x[j] < min)
{
min = x[j];
indexMin = j;
}
}
x[indexMin] = x[start];
x[start] = min;
}
return x;
}
}
错误#1
您创建的数组可容纳 10 个元素:
int[] x = new int[10];
如果仔细观察,您将分配 11 个元素:
x[0] = 100;
x[1] = 23;
x[2] = 15;
// ...
x[10] = 3;
所以也许在声明时将容量更改为 11:
int[] x = new int[11];
但是有一种更简单的方法来创建该数组:
int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
注意这里没有指定数组的大小。
因此,您不能错误地提供太小或太大的尺寸。
错误 #2
在这段代码中,当i = x.length - 1
时,表达式x[i + 1]
将越界:
for (int i = 0; i < x.length; i++)
{
if (x[i] > x[i + 1])
{
placehold = x[i + 1];
x[i] = x[i + 1];
x[i + 1] = placehold;
}
}
要解决这个问题,请更改循环条件,使 i
不会达到 x.length - 1
:
for (int i = 0; i < x.length - 1; i++)
错误 3
用 System.out.println
打印 int[]
不会产生您想要的结果。
这就是你想要的:
System.out.println(Arrays.toString(bubbleSort(x)));
没有 Arrays.toString(...)
,您看到的值 [I@6d06d69c
是数组哈希码的十六进制表示。这是数组继承的 Object.toString
的默认实现。
这没什么用,获取数组的字符串表示的标准方法是使用 Arrays.toString(...)
.
注意:Arrays
在java.util
中,因此您需要为此添加导入:
import java.util.Arrays;
BubbleSort 方法的 if 条件在上一次迭代中请求索引 i+1 请求一个不存在的索引,这就是抛出异常的原因
在您的循环中,i 的值从 0 变为 10。
所以当 i = 10, x[i+1] = x[11] 但是你的数组中没有第 11 个索引,这就是为什么你得到运行时异常称为 ArrayIndexOutOfBoundsException.
所以你可以摆脱这个问题的事情是:
1)确保访问数组时不超过数组索引
2) 以错误信息为线索,调试错误。
我最近被指派为数字列表创建冒泡排序(您将在我将要向您展示的代码中找到该列表),但是,尽管程序编译得很好,但我总是得到这个运行-cmd 中的时间错误...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at hw.main(hw.java:17)
这是我目前的情况。
//Ch 9 HW 7
class hw
{
public static void main(String[] args)
{
int[] x = new int[10];
x[0] = 100;
x[1] = 23;
x[2] = 15;
x[3] = 23;
x[4] = 7;
x[5] = 23;
x[6] = 2;
x[7] = 311;
x[8] = 5;
x[9] = 8;
x[10] = 3;
System.out.println(bubbleSort(x));
}
public static int[] bubbleSort(int[] x)
{
int placehold = 0;
for (int i = 0; i < x.length; i++)
{
if (x[i] > x[i + 1])
{
placehold = x[i + 1];
x[i] = x[i + 1];
x[i + 1] = placehold;
}
}
return x;
}
}
我想知道你们是否可以给我一个错误的解释和修复它的方法。非常感谢
~安德鲁
编辑: 此代码为 "Arrays"
提供了 "cannot find symbol" 错误//Ch 9 HW 7
class hw
{
public static void main(String[] args)
{
int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
String y = Arrays.toString(bubbleSort(x));
System.out.println(y);
}
public static int[] bubbleSort(int[] x)
{
int placehold = 0;
for (int i = 0; i < x.length - 1; i++)
{
if (x[i] > x[i + 1])
{
placehold = x[i + 1];
x[i] = x[i + 1];
x[i + 1] = placehold;
}
}
return x;
}
}
最终编辑及更正:
这是给那些好奇的人的正确代码。
//Andrew Mancinelli
import java.util.*;
class hw
{
public static void main(String[] args)
{
int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
String y = Arrays.toString(bubbleSort(x));
System.out.println(y);
}
public static int[] bubbleSort(int[] x)
{
for (int start = 0; start < x.length - 1; start++)
{
int min = x[start];
int indexMin = start;
for (int j = start + 1; j < x.length; j++)
{
if (x[j] < min)
{
min = x[j];
indexMin = j;
}
}
x[indexMin] = x[start];
x[start] = min;
}
return x;
}
}
错误#1
您创建的数组可容纳 10 个元素:
int[] x = new int[10];
如果仔细观察,您将分配 11 个元素:
x[0] = 100;
x[1] = 23;
x[2] = 15;
// ...
x[10] = 3;
所以也许在声明时将容量更改为 11:
int[] x = new int[11];
但是有一种更简单的方法来创建该数组:
int[] x = {100, 23, 15, 23, 7, 23, 2, 311, 5, 8, 3};
注意这里没有指定数组的大小。 因此,您不能错误地提供太小或太大的尺寸。
错误 #2
在这段代码中,当i = x.length - 1
时,表达式x[i + 1]
将越界:
for (int i = 0; i < x.length; i++)
{
if (x[i] > x[i + 1])
{
placehold = x[i + 1];
x[i] = x[i + 1];
x[i + 1] = placehold;
}
}
要解决这个问题,请更改循环条件,使 i
不会达到 x.length - 1
:
for (int i = 0; i < x.length - 1; i++)
错误 3
用 System.out.println
打印 int[]
不会产生您想要的结果。
这就是你想要的:
System.out.println(Arrays.toString(bubbleSort(x)));
没有 Arrays.toString(...)
,您看到的值 [I@6d06d69c
是数组哈希码的十六进制表示。这是数组继承的 Object.toString
的默认实现。
这没什么用,获取数组的字符串表示的标准方法是使用 Arrays.toString(...)
.
注意:Arrays
在java.util
中,因此您需要为此添加导入:
import java.util.Arrays;
BubbleSort 方法的 if 条件在上一次迭代中请求索引 i+1 请求一个不存在的索引,这就是抛出异常的原因
在您的循环中,i 的值从 0 变为 10。 所以当 i = 10, x[i+1] = x[11] 但是你的数组中没有第 11 个索引,这就是为什么你得到运行时异常称为 ArrayIndexOutOfBoundsException.
所以你可以摆脱这个问题的事情是: 1)确保访问数组时不超过数组索引 2) 以错误信息为线索,调试错误。