Согласно разделу «Как выбрасывать и выхватывать исключения» в уроке 2 учебного комплекта для самостоятельного обучения MCTS (экзамен 70-536): Microsoft® .NET Framework 2.0-Application Development Foundation, причина в том, что исключение возможно, произошли до объявления переменных в блоке try (как уже отмечали другие).
Цитата со страницы 25:
"Обратите внимание, что объявление StreamReader было перемещено за пределы блока Try в предыдущем примере это необходимо, потому что блок finally не может получить доступ к переменным, объявленным в блоке Try. Это имеет смысл, поскольку в зависимости от того, где произошло исключение, объявления переменных в блоке Try могут еще не выполняться ".
blockquote>//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 до 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 времена и т. д.