Java异常:数组索引超出范围

时间:2015-08-21 13:48:25

标签: java algorithm

我得到了一个实验室作业,我们被要求填充50号阵列。前25个元素有随机的不同元素,剩下的每个元素必须是26个。我们所要做的就是使用拉斯维加斯算法打印重复元素,显然是26。

我编写了这个程序,因为这是我第一次使用Java,我遇到了一个异常的数组索引超出范围。

我也确定该算法没有任何问题,请注意我首先创建了一个列表,然后将其转换为Integer类型的数组。

希望伸出援助之手。

代码如下: -

public class NewClass {
    static Random randomGenerator = new Random();
    public static void lasveg(Integer a[],int n)
    {
        int i,j;
        boolean chk= true;
        while(chk)
        {
            i=(randomGenerator.nextInt())%n+1;
            j=(randomGenerator.nextInt())%n+1;
            if((i!=j)&&(a[i].equals(a[j])))
            System.out.println("The repeated element is : " + i);
        }   
    }
    public static void main(String[] args)
    {        
        int i ;
        Integer[] arr = new Integer[50] ; //used the Integer wrapper class instead of primitive int
        ArrayList list = new ArrayList(50);
        for (i=1; i<26; i++) 
        {
            list.add(i) ;
        } 
        Collections.shuffle(list);
        for(i=26 ; i<51 ; i++)
        {
            list.add(26) ;
        }      
        list.toArray(arr) ;
        for(i=0 ; i<50 ; i++)
        {
            System.out.print(arr[i] + " "); 
        }
        lasveg(arr,50);
    }
}

4 个答案:

答案 0 :(得分:2)

代码有几个问题:

  1. randomGenerator.nextInt()可以返回负数而你 不能使用负数作为数组的索引。

  2. 如果您使用%n + 1,则可以获得大于49的索引 应该是长度为50的数组中的最高索引。

  3. 第三件事是你有一个无限循环,因为你永远不会 结束时间(真实)

  4. 如果您更改了所有内容,那么您的代码可能如下所示:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Random;
    
    public class NewClass {
        static Random randomGenerator = new Random();
    
        public static void lasveg(Integer a[], int n) {
            int i, j;
            boolean chk = true;
            while (chk) {
                i = Math.abs(randomGenerator.nextInt()) % n ;
                j = Math.abs(randomGenerator.nextInt()) % n ;
                if ((i != j) && (a[i].equals(a[j]))){
                    System.out.println("The repeated element is : " + i);
                    break;
                }
            }
        }
    
        public static void main(String[] args) {
            int i;
            Integer[] arr = new Integer[50]; // used the Integer wrapper class
                                                // instead of primitive int
            ArrayList list = new ArrayList(50);
            for (i = 1; i < 26; i++) {
                list.add(i);
            }
            Collections.shuffle(list);
            for (i = 26; i < 51; i++) {
                list.add(26);
            }
            list.toArray(arr);
            for (i = 0; i < 50; i++) {
                System.out.print(arr[i] + " ");
            }
            lasveg(arr, 50);
        }
    }
    

    输出:

    24 20 19 14 13 16 10 7 22 18 12 15 2 6 3 25 17 8 1 21 4 5 11 23 9 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 The repeated element is : 26
    

答案 1 :(得分:1)

如果你用n = 50调用这个函数而你的数组有50个元素



    public static void lasveg(Integer a[],int n)
        {
            int i,j;
            boolean chk= true;
            while(chk)
            {
                i=(randomGenerator.nextInt())%n+1;
                j=(randomGenerator.nextInt())%n+1;
                if((i!=j)&&(a[i].equals(a[j])))
                System.out.println("The repeated element is : " + i);
            }   
    }

如果随机数为(50 * x)-1%50 + 1,则调用[50]会导致超出范围异常。 您不希望增加术语 rand%n ,然后您将获得0到49之间的范围。

答案 2 :(得分:1)

您的ij变量在从0到n的细分中分配了一个随机数,包括n

i=(randomGenerator.nextInt())%n+1;
j=(randomGenerator.nextInt())%n+1;

在Java中,n元素数组的最后一个元素的索引是n-1,所以有可能,这个语句

if((i!=j)&&(a[i].equals(a[j])))
System.out.println("The repeated element is : " + i);

将导致索引超出绑定异常。

答案 3 :(得分:1)

你遇到的问题是你必须注意数组从0号位置开始

array[0];

因此,当您使用方法lasveg时,您设置了数字50,并且真正尝试访问您51和{{1}所在的位置a[i]这里:

a[j]

要解决您的问题,您必须这样做:

if((i!=j)&&(a[i].equals(a[j])))

避免lasveg(arr,49); + 1的另一个解决方案。改变这个:

Random

到此:

i=(randomGenerator.nextInt())%n+1;
j=(randomGenerator.nextInt())%n+1;

我希望它会对你有所帮助!