在这种特定情况下的Java数组异常

时间:2015-11-03 21:09:16

标签: java

为什么:线程中的异常" 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();
        }
    }

}

2 个答案:

答案 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 }}