【问题标题】:why my code give error of arrayIndex out of bound? [duplicate]如果数组索引超出范围,为什么我的代码会出错? [复制]
【发布时间】:2022-11-24 00:33:05
【问题描述】:
import java.util.Scanner;

public class recursion_4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a[] = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        printArray(a, 0);
        sc.close();
    }

    static void printArray(int arr[], int i) {
        if (i == arr.length) {
            return;
        }
        printArray(arr, ++i);
        System.out.println(arr[i]);
    }
}

我尝试使用递归打印数组元素。

但如果数组索引超出范围,它会给出错误。

【问题讨论】:

    标签: java arrays recursion


    【解决方案1】:

    将 ++i 替换为 i+1

    您正在增加函数中局部变量的值。不要递增,而是将下一个值发送到其他函数,因为您将在函数中打印时使用该局部变量值。

    【讨论】:

      【解决方案2】:

      ++i 增加值 - 它实际上改变了它(并评估为更新值。)

      ++ii++ 以及它们之间的细微差别导致了许多令人沮丧的错误。这只是我的意见,但我建议永远不要使用它们中的任何一个,除非当你需要增加一些东西时作为单行语句。简洁不值得冒错误的风险。

      因此,如果您输入 printArrayi=arr.length-1,那么您将越过 i 守卫,增加 i,进行递归调用(返回),然后尝试访问 `arr[arr.length - 1 + 1],这出界了。

      如果您刚刚了解递归,您可能会对局部变量和返回值在方法中的工作方式感到困惑。每次调用一个方法时,都会有一个新的堆栈帧(一段内存),其局部变量的值完全不同,并且独立返回。 i不是“printArray方法的每次使用中的i”,它只是“i方法printArray的当前应用中的@”。同样,当您返回时,您将停止运行当前的printArray 的应用程序,但不是每个应用程序。

      抱歉,如果这部分是您所知道的所有内容 - 我发现这是让刚开始的人完全难以理解的事情之一,然后在一周后变得非常明显。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        相关资源
        最近更新 更多