【问题标题】:Java array exception in this specific case [duplicate]这种特定情况下的Java数组异常[重复]
【发布时间】:2015-11-03 21:09:16
【问题描述】:

为什么这样:线程“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();
        }
    }

}

【问题讨论】:

    标签: java


    【解决方案1】:
    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 &lt; 20; i++),那么尝试在循环外使用i 将立即被捕获。

    【讨论】:

      【解决方案2】:
      for (i=1; i<20;i++ ); //<-- here
          A[i] = i-1*K/3.0d;
      

      你在for 的末尾有一个分号; 导致它20 次什么都不做,然后当i = 20 导致ArrayIndexOutOfBoundsException 时你尝试访问A[i]

      【讨论】:

        【解决方案3】:

        让我们专注于这一行:

        for (i=1; i<20;i++ );
        

        你认为i退出循环后的值是多少?

        提示:它是 20。

        在那个循环之后你正在执行这个:

        A[i] = i-1*K/3.0d;
        

        您已经知道i 是 20,数组大小也是 20,索引为 0 到 19。所以这是问题的根源。不完全是,你真正的问题是每个;for 循环之后:

        for (i=0; i<20; i++);
        

        这里:

        for (i=1; i<20;i++ );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-08
          • 2020-04-29
          • 2013-03-21
          相关资源
          最近更新 更多