2015-02-17 2 views
0

У меня есть код для пустяка/unscramble bot, который запускался на сервере, на котором пользователь пытается угадать ответ на вопрос до того, как время закончится. Код компилируется отлично, но после запуска потока в течение 30-45 минут, я получаю сообщение об ошибке, и мелочи перестают работать. Здесь ошибка я получаю:Ошибка: «Thread-1» java.lang.IndexOutOfBoundsException

Exception in thread "Thread-1" java.lang.IndexOutOfBoundsException: 
    Index: 973, Size 965 
    at java.util.ArrayList.rangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at org.emulinker.kaillera.model.impl.Trivia.run(Trivia.java:251) 
    at java.lang.Thread.run(Unknown Source) 

Вот код для org.emulinker.kaillera.model.impl.Trivia, начиная с линии 249:

 else{ 
      temp = generator.nextInt(questions.size() - 1); 
      questions_count = questions_num.get(temp); 
      questions_num.remove(temp); 
     } 

Любые идеи о том, как решить эту проблему?

+1

Отсортируйте код и укажите номер строки. – Saravana

+1

какая линия бросает исключение? – SMA

+0

'temp = generator.nextInt (questions.size() - 1);' выдает исключение – user3085046

ответ

4

Я не уверен, что другая информация Java может дать вам, чтобы это стало проще.

Это говорит вам точной линию Trivia.java:251, размер сбора 965 и индекс, который вы пытаетесь использовать 973. Наверняка этого достаточно, чтобы продолжать?

Обычно у меня мало шансов выяснить, какая из этих нескольких сотен строк - строка 251, однако мне скучно в данный момент, поэтому я дам ему шанс (и, в любом случае , вы с тех пор заменили массивный дамп кода только соответствующими строками). Странствующих Похоже, что строка:

else{ 
    temp = generator.nextInt(questions.size() - 1); 
    questions_count = questions_num.get(temp);  // << THIS ONE 
    questions_num.remove(temp); 
} 

Сейчас я не собираюсь идти через полностью ваш «Война и мир» -style фрагмента кода, который Вам кажется, что удовлетворяет «маленький пример, который демонстрирует проблему ":-)

Но я бы сказал, что это безопасная ставка, что questions и questions_num разошлись размером где-то, предполагая, что они даже были того же размера в какой-то момент в прошлом. Вполне возможно, что они расходились из-за этой третьей строки в блоке else выше или, точнее, из-за отсутствия четвертой строки, которая влияет на questions таким же образом.

Тот факт, что вы получили 973 от генератора, используя questions, несмотря на то, что размер questions_num составляет всего 965, делает это почти уверенностью.

Возможно, было бы неплохо держать их в синхронизации.

+0

Спасибо за помощь, извините за фрагмент кода. Итак, чтобы исправить эту проблему, мне нужно синхронизировать вопросы и вопросы_num? Я довольно новичок в программировании, и я только пытаюсь «исправить» то, что, по моему мнению, является небольшими ошибками в программе, которую я использую ежедневно, чтобы сообщество, в котором я работаю, может пользоваться рабочим сервером. Другими словами, можете ли вы разбить его для меня и объяснить мне, как я был воспитателем детского сада? :) – user3085046

+0

@ user3085046, не будьте такими «немецкими словами высокого фалутина» здесь, когда «новичок» будет делать то же самое :-) Но, юмор в сторону, да. Предполагая, что они _meant_ синхронизированы, неплохо удалить индекс 'temp' из' questions_num' и _not_ 'questions'. Если они не предназначены для синхронизации, вы, вероятно, захотите использовать 'temp = generator.nextInt (questions_num.size() - 1); вместо этого. Все сводится к намерениям, которые, к сожалению, я не знаю, потому что я действительно не хочу читать 450 с лишним строк кода :-) – paxdiablo

+0

Это не помогло, но большое спасибо за помощь. Я попытаюсь это – user3085046

2

Исключение в потоке java.lang.IndexOutOfBoundsException "Thread-1":
индекс: 973, размер 965

Это исключение само за себя. Размер questions_num является 965 и ваш пытаются получить доступ к нему за пределы i.e. 973

Как JavaDocs говорит

IndexOutOfBoundsException является Брошенный, чтобы указать, что индекс некоторого вида (например, в массив, чтобы в строка или вектор) вне диапазона.

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