出界!?!我没有看到它

时间:2015-02-13 01:06:00

标签: java arrays for-loop recursion methods

说我一直走出界限([32],[36])我几乎改变了所有我能想到的东西。有什么建议吗?

public class FindMaxRecursive {

    public static void main(String[] args) {
        Scanner kbd = new Scanner(System.in);
        int[] a = new int[5];
        System.out.println("Enter 5 integers: ");
        int i;

        for (i = 0; i < 5; i++) {
            a[i] = kbd.nextInt();
        }
        System.out.println("largest element in array: " + findMax(a, i));
    }

    public static int findMax(int[] a, int i) {
        if (i > 0) {
            // exception on the next line
            return Math.max(a[i], findMax(a, i + 1)); 
        }

        else {
            return a[0];
        }
    }
}

输入,输出和输出例外:

Enter 5 integers: 
1 2 3 4 5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at Snippet.findMax(Snippet.java:19)
    at Snippet.main(Snippet.java:14)

findMax声明中的if

2 个答案:

答案 0 :(得分:4)

for循环结束时,变量i留有5,因此它指向数组外部。 (数组的有效索引是0到4.)因此,当您稍后(在findMax()内)使用它来寻址a[i]时,您正在访问一个不存在的元素。

我强烈建议你学习使用调试器,这样你就可以自己找到这样的简单错误,而不必询问stackoverflow。

答案 1 :(得分:0)

在对findMax的初始调用中,您传递的i已经增加到5。但是Java中的索引从0length - 14在这里运行。通过i - 1来引用数组中的最后一个位置。

但是,您仍然会尝试查看i中的i + 1findMax位置,这些位置仍将超出范围。您已经获得的递归方法找到当前元素与其前数组其余部分的最大值之间的最大值,因此您需要在递归调用中传递i - 1,而不是i + 1