Добавление 1 к индексу массива в каждом цикле [дубликат]

Согласно разделу «Как выбрасывать и выхватывать исключения» в уроке 2 учебного комплекта для самостоятельного обучения MCTS (экзамен 70-536): Microsoft® .NET Framework 2.0-Application Development Foundation, причина в том, что исключение возможно, произошли до объявления переменных в блоке try (как уже отмечали другие).

Цитата со страницы 25:

"Обратите внимание, что объявление StreamReader было перемещено за пределы блока Try в предыдущем примере это необходимо, потому что блок finally не может получить доступ к переменным, объявленным в блоке Try. Это имеет смысл, поскольку в зависимости от того, где произошло исключение, объявления переменных в блоке Try могут еще не выполняться ".

-1
задан SoloTriesToLearn 18 January 2019 в 17:19
поделиться

2 ответа

//have to add +1 so I don't get 0

Нет, действительно нет.

В Java массивы основаны на 0. Значение массива из 11 элементов имеет индексы 0 .. 10.

Random.nextInt(n) возвращает значение между 0 и n-1.

Поэтому выражение ((die1.nextInt(6)+1)+(die2.nextInt(6)+1)) будет между 2 .. 12.

Либо увеличьте размер массива до 13, чтобы подгонять 12 (первые 2 элемента останутся неиспользованными), либо просто удалите +1 's:

    Random die1 = new Random(), die2 = new Random();
    int [] counters = new int [11];
    for (int i = 0; i <1001; i++){
        ++counters[die1.nextInt(6)+die2.nextInt(6)];
    }

Также вы можете' t распечатать массив с помощью print (). Возможное решение состоит в том, чтобы печатать каждый элемент отдельно:

    for (int i = 0; i < counters.length; ++i) {
        System.out.print((i+1) + ":" + counters[i] + " ");
    }
    System.out.println();
0
ответ дан rustyx 18 January 2019 в 17:19
поделиться

У вас есть две кости, и результат броска кубика может быть от 0 до 5. Я предполагаю, что 1001 означает, что вы хотите бросить две кости 1001 раз. Пожалуйста, дайте мне знать, если я что-то пропустил здесь.

В этом случае ваш минимальный бросок будет равен 0, а максимальный - 10. Но добавление 1 к обоим броскам костей перед доступом будет означать, что ваш индекс изменяется от 2 до 12, что приводит к вашему ArrayIndexOutOfBoundsException.

Просто ничего не добавляйте в список. Помните, что массивы java начинаются с 0, поэтому диапазон от 0 до 10 вполне подойдет.

Быстрый пример:

public static class Die {
    static Random rand = new Random();

    public static int nextInt(int val) {
        return rand.nextInt(val);
    }
}

public static void main(String[] args) {
    int[] counters = new int [11];
    for (int i = 0; i <1001; i++){
        //no need to add anything
        ++counters[Die.nextInt(6) + Die.nextInt(6)];
    }
    System.out.print(Arrays.toString(counters));
}

Пример выходных данных:

[27, 60, 81, 106, 157, 175, 120, 109, 81, 55, 30]

Что мы можем перевести, чтобы обозначить, что «2» было брошено 27 раз, «3» 60 времена и т. д.

0
ответ дан Stalemate Of Tuning 18 January 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: