2015-11-03 2 views
0

почему это: Исключение из потока «main» java.lang.ArrayIndexOutOfBoundsException: 20 Мне нужно ввести 20 двойных чисел типа в зависимости от K, если k равно 0, все 20 должны быть случайными между -10 и 20, если нет, то они должны быть вычислены следующим образом: A [я] = A [я-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 

As в стороне, первый цикл кажется ненужным, поскольку вы только установили с ним один индекс. Вы можете просто удалить этот цикл и просто иметь 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

Смежные вопросы