此特定情况下的 Java 数组异常

标签 java

为什么这个:线程“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/

相关文章:

java - 使用 Active Android 将日期保存到 sqlite 数据库

java - 为什么我的 TextView 在每个列表项中的位置不同?

java使用代理api声明匿名类

java - 在 Java 中放置 SQL 语句的最佳位置

java - 如何从另一个 hadoop 作业提交 hadoop 作业

java - 如何让java扫描器接受多个字符串输入?

java - HTTP 请求后在单独的线程上更改渲染屏幕

java - 如何打印单个索引?

java - 使用 tcpdump 记录失败的 HTTP 请求

java - 在运行时生成类的新实例失败