提问人:Samik Pandit 提问时间:6/27/2022 最后编辑:Lajos ArpadSamik Pandit 更新时间:6/28/2022 访问量:129
我面临的代码问题在哪里 数组索引越界 问题?
Where is the problem in code for which I am facing Array Index out of Bounds problem?
问:
我在用 Java 语言编码的合并排序中遇到了一个问题。请你看看我错了哪里,因为我面临索引越界问题。 我正在分享代码。请检查 !
输出框中的错误是:
“线程”main“java.lang.ArrayIndexOutOfBoundsException 中的异常:索引 1 超出长度 1 的范围”
代码 : code
import java.util.Arrays;
public class Sorting {
public static void main(String[] args) {
int[] arr = {5,3,4,7,2,8,6,9,1};
mergesort(arr);
}
static void mergesort(int[] arr){
mergesortalgorithm(arr,0, arr.length);
System.out.println("The sorted array is :" + Arrays.toString(arr));
}
static void mergesortalgorithm(int[] arr,int lb,int ub){
if (lb < ub){
int mid = (lb + ub)/2;
mergesortalgorithm(arr,lb,mid);
mergesortalgorithm(arr,mid + 1,ub);
merge(arr,lb,mid,ub);
}
}
static void merge(int[] arr,int lb,int mid,int ub){
int i = lb;
int j = mid + 1;
int k = 0;
int[] newarray = new int[lb + ub];
while (i <= mid && j <= ub){
if (arr[i] <= arr[j]){
newarray[k] = arr[i];
i++;
}
else {
newarray[k] = arr[j];
j++;
}
k++;
}
if (i > mid){
while (j <= ub){
newarray[k] = arr[j];
j++;
k++;
}
}
else {
while (i <= mid){
newarray[k] = arr[i];
i++;
k++;
}
}
for (int l = lb;l <= ub;l++){
arr[l] = newarray[l];
}
}
}
答:
ArrayIndexOutOfBoundsException 是当您尝试使用超出其边界的无效索引访问数组的项时引发的异常。
元素数组的第一个元素索引为 0,第二个元素索引为 1,依此类推,最后一个索引为 n - 1。
所以,假设你有一个数组,它有 9 个元素。这意味着,尝试访问具有负索引的元素(例如 )或尝试访问超过 8 的任何项(例如 或 )将引发 'ArrayIndexOutOfBoundsException。int[] arr = {5,3,4,7,2,8,6,9,1}
arr[-4]
arr[9]
arr[234]
克服此类错误的一个非常简单的方法是找到它发生的确切行,例如
newarray[k] = arr[i];
并且看到当变为 1 时,则具有单个元素的 ,不能引用它,因为它具有单个元素,索引为 0。因此,为了解决这个问题,人们很想添加安全检查,以确保您永远不会越过界限,例如k
newarray
while ((i <= mid && j <= ub) && (i < arr.length) && (j < arr.length)){
最终达到句法正确
static void merge(int[] arr,int lb,int mid,int ub){
int i = lb;
int j = mid + 1;
int k = 0;
int[] newarray = new int[lb + ub];
while ((i <= mid && j <= ub) && (i < arr.length) && (j < arr.length)){
if (arr[i] <= arr[j]){
newarray[k] = arr[i];
i++;
}
else {
newarray[k] = arr[j];
j++;
}
k++;
}
if (i > mid){
while ((j <= ub) && (k < newarray.length) && (j < arr.length)){
newarray[k] = arr[j];
j++;
k++;
}
}
else {
while ((i <= mid) && (k < newarray.length)){
newarray[k] = arr[i];
i++;
k++;
}
}
for (int l = lb;(l <= ub) && (l < newarray.length) && (l < arr.length);l++){
arr[l] = newarray[l];
}
}
,但这只能解决语法问题,不会触及您遇到的逻辑问题,并且会产生不正确的结果。所以,很明显,你的问题不在于让索引越界异常,它只是症状。实际问题出在逻辑上。[0, 0, 0, 0, 0, 0, 3, 3, 0]
所以,你有一些错误的假设。但它可能是什么?对于初学者,你有这样一行:
mergesortalgorithm(arr,0, arr.length);
想想这一行:第一项是第 0 项,而最后一项是第 arr.length 项。你这里有多少件物品?总共 arr.length + 1 个项目。这意味着当您引用最后一项时,您肯定会越界。因此,您需要修复您的逻辑,最后,如果您的算法保证在适当的范围内工作,您很可能甚至不需要进行语法安全检查。上面的行应改为
mergesortalgorithm(arr,0, arr.length - 1);
此外,您还需要跟踪索引是如何更改的,尤其是您是如何准确实现算法的。k
评论
newarray[k] = arr[i];