我正在使用数组列表来存储有关屏幕上移动对象的数据。我怀疑这是因为我的渲染器和我的逻辑在不同的线程上运行,但有时当从列表中删除数据时,我得到一个indexOutOfBoundsException。我已经采取了我能想到的所有步骤来避免这种情况,包括try / catch,但有时会发生异常。这是我的渲染器线程中似乎导致异常的部分。
public void drawMobs(GL10 gl) {
boolean playing = MyLaunchActivity.getPlaying();
if(playing == true){
try{
ArrayList<String> mobDat = Play.getMobDat();
while (currentLoadSpace < mobDat.size()){
if(!mobDat.isEmpty() || currentLoadSpace < mobDat.size()){
loadObject = mobDat.get(currentLoadSpace);
float loadCoordX = Float.parseFloat(mobDat.get(currentLoadSpace + 2));
float loadCoordY = Float.parseFloat(mobDat.get(currentLoadSpace + 3));
/*some rendering*/
currentLoadSpace+=4;
}
}
}catch( ArrayIndexOutOfBoundsException e){ Log.d(TAG, "caught");}
currentLoadSpace = 0;
}}
你可以看到我尝试过一些东西,但错误仍然存在。这是错误日志
01-02 14:02:42.650: E/AndroidRuntime(6947): FATAL EXCEPTION: GLThread 10
01-02 14:02:42.650: E/AndroidRuntime(6947): java.lang.IndexOutOfBoundsException: Invalid index 23, size is 20
01-02 14:02:42.650: E/AndroidRuntime(6947): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
01-02 14:02:42.650: E/AndroidRuntime(6947): at java.util.ArrayList.get(ArrayList.java:308)
01-02 14:02:42.650: E/AndroidRuntime(6947): at basicmelon.games.agameofsorts.LoadLevel.drawMobs(LoadLevel.java:530)
01-02 14:02:42.650: E/AndroidRuntime(6947): at basicmelon.games.agameofsorts.MyGLSurfaceRenderer.onDrawFrame(MyGLSurfaceRenderer.java:82)
01-02 14:02:42.650: E/AndroidRuntime(6947): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1429)
01-02 14:02:42.650: E/AndroidRuntime(6947): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1184)
答案 0 :(得分:2)
您的代码不一致且相当错误。例如,为什么你测试两次相同的条件? (currentLoadSpace < mobDat.size()
)
其次,您的错误来自:
mobDat.get(currentLoadSpace + 3)
当mobDat
仅包含 21 元素时,您正在搜索 23 的索引。
因此,您应检查以下行是否实际上小于mobDat.size()
:
currentLoadSpace + 2
和
currentLoadSpace + 3
答案 1 :(得分:1)
一种可能的解决方案可能是:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
如果这不是一个选项,您可以使用synchronized(yourList){}来阻止concurent修改。
答案 2 :(得分:0)
我认为你必须同步对ArrayList的访问。 ArrayList不是线程安全的。捕获IndexOutOfBoundsException是糟糕的设计。您的代码应避免此异常。
答案 3 :(得分:0)
您需要检查arraylist大小。 删除的位置不应大于列表的大小
你需要做类似下面的事情
void avoidArrayIndexOutOfBounds(int position, ArrayList listOfdata){
if(position>(listOfdata.size()-1)){
position = listOfdata.size()-1;
}
}
答案 4 :(得分:0)
另请注意,您正在检查currentLoadSpace是否小于mobDat.size(),但您正尝试从currentLoadSpace + 3进行检索(就这段代码而言,可能是边界)。
答案 5 :(得分:0)
我知道已有答案,但只需抓住IndexOutOfBoundsException
代替ArrayIndexOutOfBoundsException
我建议这是因为你正在捕获Array异常并且仍然获得标准的Index异常。这很可能是由于Index是一个“更高/更低”(但是你想看到它)异常而不是Array异常。这意味着您确实捕获了Array异常,但除此之外,仍然会抛出Index 1。