数组访问时出现 ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException on array access
下午好!我必须创建 2 个数组。第一个应该创建一个随机数 (-10;10) 如果用户写 0,否则它应该使用输入的公式计算;第二个数组应该首先写入 array1 中的元素,这些元素具有不均匀的 个位置 ,然后是偶数个位置。所以基本上在 array2 0-10 位置为奇数,然后 11-19 位置为偶数。
但不幸的是,当我 "run" 程序第二个数组出现错误时:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 20 out of bounds for length 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();
}
在 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);
做如下修改,你的代码会很好运行,
double B[ ] = new double[ 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条件中的z换成p就可以了
if (p % 2 == 0)
下午好!我必须创建 2 个数组。第一个应该创建一个随机数 (-10;10) 如果用户写 0,否则它应该使用输入的公式计算;第二个数组应该首先写入 array1 中的元素,这些元素具有不均匀的 个位置 ,然后是偶数个位置。所以基本上在 array2 0-10 位置为奇数,然后 11-19 位置为偶数。 但不幸的是,当我 "run" 程序第二个数组出现错误时:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 20 out of bounds for length 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();
}
在 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);
做如下修改,你的代码会很好运行,
double B[ ] = new double[ 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条件中的z换成p就可以了
if (p % 2 == 0)