查找最大元素中的线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常

时间:2014-02-22 21:32:21

标签: java exception-handling indexoutofboundsexception

每当我尝试运行此代码时,它都会让我超出绑定范围。任何人都可以指出我的错误。

package com.programs.interview;
import java.util.Scanner;

public class FindMaxNumInArray {

public static void main (String[] args) 
{ 
    Scanner scan = new Scanner (System.in); 
    System.out.print("Enter the size of the array: "); 
    int arraySize = scan.nextInt(); 
    int[] myArray = new int[arraySize]; 
    System.out.print("Enter the " + arraySize + " values of the array: "); 
    for (int i = 0; i < arraySize; i++)
        myArray[i] = scan.nextInt(); 
    for (int j = 0; j < arraySize; j++) 
        System.out.println(myArray[j]); 
    System.out.println("In the array entered, the larget value is "+ maximum(myArray,arraySize) + "."); 
} 

public static int maximum(int[] arr, int Arraylength){
    int tmp;
    if (Arraylength == 0)
        return arr[Arraylength];
    tmp = maximum(arr, Arraylength -1);
    if (arr[Arraylength] > tmp)
        return arr[Arraylength];
    return tmp;
  }
}

输出

  

输入数组的大小:5输入数组的5个值:1 2 3   4 5 1 2 3 4 5线程“main”中的例外情况   java.lang.ArrayIndexOutOfBoundsException:5 at   com.programs.interview.FindMaxNumInArray.maximum(FindMaxNumInArray.java:26)   在   com.programs.interview.FindMaxNumInArray.main(FindMaxNumInArray.java:17)

5 个答案:

答案 0 :(得分:3)

这是问题所在:

if (arr[Arraylength] > tmp)

有效数组索引从0转到length-1array[array.length] 始终无效,并且在首次通话时,ArrayLength等于arr.length

说实话,目前还不清楚你为什么要使用递归。迭代解决方案会简单得多 - 但如果数组为空,您需要计算出您想要做的事情。

编辑:如果你真的想要我如何编写递归表单,那就是这样的:

/** Returns the maximum value in the array. */
private static int maximum(int[] array) {
    if (array.length == 0) {
        // You need to decide what to do here... throw an exception,
        // return some constant, whatever.
    }
    // Okay, so the length will definitely be at least 1...
    return maximumRecursive(array, array.length);
}

/** Returns the maximum value in array in the range [0, upperBoundExclusive) */
private static int maximumRecursive(int[] array, int upperBoundExclusive) {
    // We know that upperBoundExclusive cannot be lower than 1, due to the
    // way that this is called. You could add a precondition if you really
    // wanted.
    if (upperBoundExclusive == 1) {
        return array[0];
    }
    int earlierMax = maximumRecursive(array, upperBoundExclusive - 1);
    int topValue = array[upperBoundExclusive - 1];
    return Math.max(topValue, earlierMax);

    // Or if you don't want to use Math.max
    // return earlierMax > topValue ? earlierMax : topValue;
}

答案 1 :(得分:2)

您无法访问

arr[Arraylength]

最后一个元素是

arr[Arraylength -1]

例如,如果你有

int arr[] = new int[5];

然后元素将位于4,因为索引从0

开始
arr[0], arr[1], arr[2], arr[3], arr[4]

答案 2 :(得分:0)

您的问题出现在以下代码中:

if (arr[Arraylength] > tmp)
            return arr[Arraylength];

索引从0开始,因此您将超出包含5个元素[1,2,3,4,5]索引的数组:[0,1,2,3,4]

答案 3 :(得分:0)

我会使用一个普通的循环。 Java没有特别好地进行递归。

public static int maximum(int[] arr) {
    int max = Integer.MIN_VALUE;
    for(int i : arr) if (i > max) max = i;
    return max;
}

答案 4 :(得分:0)

这里

System.out.println("In the array entered, the larget value is "+ maximum(myArray,arraySize) + ".");

你正在传递数据大小,在最大方法中你要返回 arr [Arraylength] ,它给出了ArrayIndexOutOfBound,所以在调用最大值时更改(yArray,arraySize- 1)返回arr [Arraylength-1] 声明。