Java 1.4.2 — ошибка ArrayIndexOutOfBounds

(Я использую Java 1.4.2). Я хотел иметь массив, который должен подбрасывать «монету» определенное количество раз, заданное пользователем (монета может подбрасываться до 1000 раз). Затем случайным образом сгенерируйте целое число от 1 до десяти и сохраните все числа в массиве. У меня есть следующий код, но он продолжает давать мне следующую ошибку:

Исключение в потоке «основной» java.lang.ArrayIndexOutOfBoundsException: 7 в CoinFlip.main(CoinFlip.java:42)

Вот код, который я написал.

import java.io.*;
import java.math.*;

public class CoinFlip
{
    public static void main(String[] args) throws IOException
    {
        // setting up variables
        String timesString;
        int times;
        // setting up input
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));


        do
        {
            // times will display how many times the coin will flip
            // loop if times does not fulfill the requirements
            System.out.println("How many times do you want the coin to flip? (MUST be an integer between 1 to 1000)");
            timesString = in.readLine();
            // convert timesString into an integer
            times = Integer.valueOf(timesString).intValue();
            if((times > 1000)||(times < 1))
            {
                System.out.println("ERROR: The number of times you flip the coin must be an integer between 1 and 1000.");
            }
            System.out.println("The value for times is " +times);
        }
        while((times > 1000)||(times < 1));


        // create a new array
        double flip[] = new double[times];

        // create a new variable timeStore that sets the boolean conditions for the For Loop
        int timeStore;
        for(timeStore = 0; timeStore <= times-1; timeStore++)
        {
            System.out.println("timeStore (how many iterations) is " +timeStore);
            System.out.println("FOR LOOP:  When " +timeStore+ " is less than or equal to " +(times-1));
            flip[times] = Math.round(Math.random()*9)+1;
            // the line above stores a random integer between 1 and 10 within the current index
            System.out.println("flip["+times+"] = "+flip[times]);
        }

    }
}

person danjonila    schedule 07.08.2013    source источник
comment
В следующий раз, пожалуйста, не заставляйте нас считать (или разумно пытаться различить), где находится строка 42. Кроме того, спасибо, что сделали это строкой 42. :-)   -  person jason    schedule 07.08.2013


Ответы (2)


В строке 42;

flip[times] = Math.round(Math.random()*9)+1;

Должно быть;

flip[timeStore] = Math.round(Math.random()*9)+1;

Затем также в System.out на строке 44.

person Robadob    schedule 07.08.2013
comment
Большое спасибо. Я сделал то, что вы предложили, и это сработало! - person danjonila; 09.08.2013

Это неправильно:

42: flip[times] = Math.round(Math. random()* 9 ) + 1;
44: System.out.println("flip[" + times + "] = " + flip[times]);

Похоже, вы имели в виду

42: flip[timeStore] = Math.round(Math.random()*9)+1;
44: System.out.println("flip["+timeStore+"] = "+flip[timeStore]);

Поскольку вы объявили flip массивом размера times, допустимы только индексы 0...(times - 1). В частности, индекс times недействителен, поэтому flip[times] вызовет исключение.

Обратите внимание, что компилятор сообщил вам ошибочную строку и переданный оскорбительный индекс. Он сообщает вам, что вы передали 7 в качестве индекса. Но обратите внимание, это исключение происходит на первой итерации вашего цикла. Вы можете сказать это по выводу, который должна была произвести ваша программа, поскольку в вашем коде есть полезные операторы отладки печати. Таким образом, вы должны были рассуждать: эй, почему мой массив видит индекс 7 на первой итерации цикла, когда индекс должен быть равен 0? В этот момент ошибка практически проясняется.

Кроме того, идиоматическое использование массивов:

for(timeStore = 0; timeStore < times; timeStore++)

но даже лучше:

for(timeStore = 0; timeStore < flip.length; timeStore++)
person jason    schedule 07.08.2013
comment
Спасибо вам за помощь. Я также новичок в Stack Overflow, поэтому не знаю, как обозначить код цифрами сбоку. - person danjonila; 09.08.2013
comment
@danjonila: Ну, вам не нужно помечать все номера строк, просто пометьте номера строк с нарушениями. - person jason; 09.08.2013
comment
Как именно я смогу это сделать? - person danjonila; 09.08.2013
comment
@danjonila: Поместите комментарий в источнике в своем ответе, который говорит // error on this line. Или извлеките оскорбительную строку из исходного кода и скажите Вот строка, в которой содержится ссылка на ошибку: flip[times] = Math.round(Math. random()* 9 ) + 1;. Вот полный источник для контекста: а затем дайте полный источник (как вы уже сделали). Двойной плюс хорошо бы сделать и то и другое! - person jason; 09.08.2013
comment
Спасибо. У меня также есть еще один вопрос относительно чтения файлов. Вот ссылка: stackoverflow.com /questions/18148203/java-1-4-2-reading-files/ - person danjonila; 09.08.2013