错误:“Thread-1”java.lang.IndexOutOfBoundsException

时间:2015-02-17 05:37:11

标签: java multithreading exception

我有一些琐事/解密机器人的代码,它在服务器内部运行,用户在时间到来之前尝试猜测问题的答案。代码编译好但是在运行线程大约30-45分钟后,我收到错误并且琐事停止工作。这是我得到的错误:

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);
        }

有关如何解决此问题的想法吗?

2 个答案:

答案 0 :(得分: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);
 }

现在我不打算通过您认为完整的#34; War and Peace&#34;风格的代码片段来满足显示问题的最小范例&#34; 34; : - )

但是我可以肯定地说questionsquestions_num在某个地方的大小有所不同,假设他们甚至 相同的大小过去的某些观点。由于上面else区块中的第三条线,或者更准确地说,缺少以同样方式影响questions的第四条线,它们很可能会发生分歧。

尽管questions的大小仅为965,但使用questions_num从生成器获得973的事实使得这几乎是确定的。

将它们保持同步可能是一个好主意。

答案 1 :(得分:2)

  

线程中的异常&#34;线程-1&#34; java.lang.IndexOutOfBoundsException:
  指数:973,规格965

此例外不言自明。 questions_num的大小为965,您正试图在边界i.e. 973之外访问它

正如JavaDocs所说

  

IndexOutOfBoundsException被抛出以指示某种索引(例如对于数组,指向   字符串或矢量)超出范围。