为什么:线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:20我需要根据K输入20个类型的双数,如果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();
}
}
}
答案 0 :(得分:10)
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
将立即被捕获。
答案 1 :(得分:0)
for (i=1; i<20;i++ ); //<-- here
A[i] = i-1*K/3.0d;
;
末尾有一个分号for
,导致它无法执行任何操作20次,然后当A[i]
导致i = 20
时尝试访问ArrayIndexOutOfBoundsException
}}