2015-11-03 56 views
0

为什么这样:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:20我需要根据K输入20个双精度数字,如果k为0,所有20应该是-10 20如果没有,他们必须通过这个来计算:A [1] = A [I-1]在这个特定情况下的Java数组异常

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(); 
     } 
    } 

} 

回答

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会立即被捕获。

+0

它的工作,谢谢你救了我!d –

0
for (i=1; i<20;i++); //<-- here 
    A[i] = i-1*K/3.0d; 

您在for年底有一个分号;导致它没有做20次,然后尝试配件系列A[i]i = 20造成ArrayIndexOutOfBoundsException