2015-11-12 7 views
1
for (int i = 0; i < 15; i+=3) { 
     System.out.print("Enter Exam Mark:"); 
     Marks[i] = input.nextInt(); 
     System.out.print("Enter Coursework Mark:"); 
     Marks[i+1] = input.nextInt(); 
     System.out.print("Enter Weighting:"); 
     Marks[i+2] = input.nextInt(); 

    } 


public double[] computemarks(int[] Marks) { 

    double[] marks = new double[6]; 
    double computedmark; 

    for (int x = 0; x < 15; x+=3) { 

     if (Marks[x] >= 35 && Marks[x+1] >= 35) { 

      computedmark = ((Marks[x+1] * Marks[x+2]) + (Marks[x] * (100.0 - Marks[x+2])))/100.0; 

     } else { 

      computedmark = Math.min(Marks[x], Marks[x+1]); 

     } 

     marks[x] = computedmark; 

    } 
    return marks; 

} 

Почему «ArrayIndexOutOfBoundsException» отображается во время выполнения? Я играл с петлями, но он все еще не работает.ArrayIndexOutOfBoundsException Ошибка Отображение

FYI, массив Marks имеет 18 доступных слотов в памяти.

ответ

1

Вашего marks массив имеет размера 6 в методе computemarks, но вы устанавливаете его с й индексом, здесь:

marks[x] = computedmark; 

который берется из цикла и после 3-я итерации равен 9 все же.

обновление согласно вашему комментарию, это может быть сделано как:

int idx = 0; //here is additional index declared 
for(int x=0; x < 15; x+=3) { 

    if (Marks[x] >= 35 && Marks[x+1] >= 35) { 

     computedmark = ((Marks[x+1] * Marks[x+2]) + (Marks[x] * (100.0 - Marks[x+2])))/100.0; 

    } else { 

     computedmark = Math.min(Marks[x], Marks[x+1]); 

    } 

    marks[idx++] = computedmark; //here is additional index is used with post incrementing 

} 
return marks; 
+0

О, теперь я вижу. Есть ли способ исправить это без установки меток на 18 слотов? –

+1

Да, просто добавьте дополнительный индекс, который будет умножен на цикл – Stanislav

+0

Не совсем уверен, что вы имеете в виду. Не могли бы вы предоставить мне пример? –