为什么这个:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 20 我需要根据 K 输入 20 个类型的 double ,如果 k 为 0,则所有 20 应该在 -10 和 20 之间随机,如果不是,它们有计算公式:A[i] = A[i-1]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Random;
public class Ld3151rdb258 {
public static void main(String[] args) {
double A[] = new double[20];
int K, i;
double C;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Andris Osītis IRDBD03 151RDB258");
System.out.print("K=");
try {
K = Integer.parseInt(br.readLine());
}
catch (Exception ex) {
System.out.println("input-output error");
return;
}
if (K==0) {
Random r = new Random();
for (i=1; i<20; i++)
A[i] = r.nextFloat()*30-10;
}
else
for (i=0; i<20; i++);
A[0] = 0.5;
for (i=1; i<20;i++ );
A[i] = i-1*K/3.0d ;
System.out.println("A:");
for (i=0; i<20; i++) {
System.out.printf("%.1f\t", A[i]);
if (i==9) System.out.println();
}
for (i=0; i<10; i++) {
C = A[i];
A[i] = A[19-i];
A[19-i] = C;
}
System.out.println("\nA:");
for (i=0; i<20; i++) {
System.out.printf("%.1f\t", A[i]);
if (i==9) System.out.println();
}
}
}
最佳答案
for (i=0; i<20; i++);
A[0] = 0.5;
for (i=1; i<20; i++);
A[i] = i-1*K/3.0d;
这些循环都没有按照您的想法进行。由于每个语句都以分号 ( for(...);
) 结尾,因此循环体为空,并且在循环完成后,下一条语句始终会计算一次。这会导致这里出现问题:
for (i=1; i<20; i++);
A[i] = i-1*K/3.0d;
(空)循环重复,直到 i
是 20,此时退出。然后,它评估 A[i] = i-1*K/3.0d;
与 i
为 20,导致错误,因为 A
中的最高有效索引19 岁。
换句话说,你写的相当于这样:
for (i=0; i<20; i++){
//Do Nothing
}
A[0] = 0.5;
for (i=1; i<20; i++){
//Do Nothing
}
A[i] = i-1*K/3.0d;//i is now 20, which throws the exception
顺便说一句,第一个循环似乎没有必要,因为您只用它设置了一个索引。您可以简单地删除该循环,然后只需 A[0] = 0.5
。或者更改它,使其使用 i
作为索引。
我强烈建议您使用可以自动缩进代码的 IDE 或编辑器。通过正确的缩进,此类问题将立即变得清晰。作为保证自身安全的另一种方法,不要在需要的范围之外声明变量。这里的问题是运行时错误,而不是更简单的编译时错误,因为您声明了 i
在函数的顶部。如果您将每个循环写为 for(int i = 0; i < 20; i++)
,然后尝试使用 i
循环外将立即被捕获。
关于此特定情况下的 Java 数组异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33509111/