【问题标题】:ArrayIndexOutOfBoundsException on array access数组访问时出现 ArrayIndexOutOfBoundsException
【发布时间】:2020-03-09 10:53:53
【问题描述】:

下午好!我必须创建 2 个数组。如果用户写 0,第一个应创建一个随机数 (-10;10),否则应使用输入的公式计数;第二个数组应该首先写入数组1中位置数不均匀的元素,然后是偶数个位置。所以基本上在 array2 0-10 位置表示奇数,然后在 11-19 位置表示偶数。 但不幸的是,当我“运行”程序第二个数组时出现错误:

线程“main”java.lang.ArrayIndexOutOfBoundsException 中的异常:索引 20 超出长度 20 的范围。

int K;  
System.out.print("K=");
if (sc.hasNextInt())
    K=sc.nextInt();
else {
    System.out.println("Error (is not an integer)");
    sc.close();
    return;
}

double A[]=new double [20];
double B[]=new double [20];

System.out.println ("result:");
System.out.println ("A: ");
if (K==0) {
    Random r=new Random();
    for (int i=0; i<20;i++) {
        A[i]=-10+20*r.nextDouble();
    }
}
if (K!=0) {
    A[0]=1;
    for (int i=1;i<20;i++) { 
        double a=Math.sin(A[i-1])*K; 
        A[i] = Math.round(a * 100.0) / 100.0;
    }
}

int i=0;
while (i<20) { 
    System.out.printf("%.2f", A[i]); System.out.print(" ");
    if (i==9) System.out.println();
    i++;
}

System.out.println ();
System.out.println ("B: ");
int even=11, uneven=0, p=0;
do { 
    int z=p;
    if (z%2==0) {
        B[even]=A[p];
        even++;
    }
    if (z%2!=0) {
        B[uneven]=A[p];
        uneven++;
    }
    p++;
} while (p<20);

for (int k=0; k<20;k++) { 
    System.out.printf ("%.2f",B[k]); System.out.print(" ");
    if (k==9) System.out.println();
}

【问题讨论】:

    标签: java arrays variable-length-array


    【解决方案1】:

    在do-while循环中:

    p=0 -> p is even, 'even' get incremented and become 12.
    p=2 -> p is even, 'even' get incremented and become 13.
    ...
    p=14 -> p is even, 'even' get incremented and become 19.
    p=16 -> p is even, 'even' get incremented and become 20. <- game over!
    

    有简单的解决方法吗?

    将所有小于 20 的整数除以 2 得到:

    0/2 = 0
    1/2 = 0
    2/2 = 1
    3/2 = 1
    4/2 = 2
    ...
    18/2 = 9
    19/2 = 9
    

    你看到模式了吗?

    新索引应该是10+(p/2)偶数p和p/2奇数p

        do { 
            if (p%2==0) { //p is even
                B[10+(p/2)]=A[p];
            }
            if (p%2!=0) { //p is odd
                B[(p/2)]=A[p];
            }
            p++;
        } while (p<20);
    

    【讨论】:

      【解决方案2】:

      进行以下更改,您的代码将可以很好地运行,

      双 B[ ] = 新双 [ 21 ];

      do
            {
               int z = p;
               if (z % 2 == 0)
               {
                  B[even] = A[p];
                  even++;
               }
               else
               {
                  B[uneven] = A[p];
                  uneven++;
               }
               p++;
            }
            while (p < 19);
      

      注意while里面的条件。

      顺便说一句,循环内不用引入z,没用,只需要在if条件中用p替换z即可。

      if (p % 2 == 0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-25
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        相关资源
        最近更新 更多