与指数14,大小16如何IndexOutOfBounds? [英] IndexOutOfBounds with Index 14, size 16. How?

查看:95
本文介绍了与指数14,大小16如何IndexOutOfBounds?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

该指数怎么会出界时,它实际上是在边界如图所示的堆栈跟踪?虽然上下文可能没有关系,我们是在一个Lua解析器/ VM NetBeans平台上的IDE工作,这样下去攀升。这怎么可能?一些奇怪的并发性问题?感谢您事先的任何见解。

  java.lang.IndexOutOfBoundsException:指数:14,尺寸:16
    在java.util.ArrayList.rangeCheck(ArrayList.java:604)
    在java.util.ArrayList.get(ArrayList.java:382)
    在org.netbeans.lib.lexer.BatchTokenList.existingToken(BatchTokenList.java:197)
    在org.netbeans.lib.lexer.BatchTokenList.tokenOffset(BatchTokenList.java:150)
    在org.netbeans.api.lexer.TokenSequence.offset(TokenSequence.java:256)
    在com.MYDevelopers.LuaSupportCompiler.TokenManager.getTokenStart(TokenManager.java:230)
    在com.MYDevelopers.LuaSupportCompiler.CompilationUnit.getCurrentLocation(CompilationUnit.java:459)
    在com.MYDevelopers.LuaSupportCompiler.CompilationUnit.ex pressionImp(CompilationUnit.java:654)
    在com.MYDevelopers.LuaSupportCompiler.CompilationUnit.ex pression(CompilationUnit.java:647)
    在com.MYDevelopers.LuaSupportCompiler.CompilationUnit.RHSex pression(CompilationUnit.java:643)
    在com.MYDevelopers.LuaSupportCompiler.CompilationUnit.chunk(CompilationUnit.java:1004)
    在com.MYDevelopers.LuaSupportCompiler.CompilationUnit.compile(CompilationUnit.java:164)
    在com.MYDevelopers.LuaSupportCompiler.CompilationUnit.compileIfRequired(CompilationUnit.java:148)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.compile(SourcesManager.java:222)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.compileAndEvaluateIfRequired(SourcesManager.java:210)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addSourceManager(SourcesManager.java:113)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addDirectory(SourcesManager.java:106)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addBootDirectory(SourcesManager.java:80)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addBaseLibraries(SourcesManager.java:72)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.<init>(SourcesManager.java:47)
    在com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.GlobalCompilationManager.addProjectDirectory(GlobalCompilationManager.java:76)
    在com.MYDevelopers.LuaSupport.LuaProject.LuaProject.getSourcesManager(LuaProject.java:309)
    在com.MYDevelopers.LuaSupport.LuaProject.LuaProject$ProjectOpenHookImpl.projectOpened(LuaProject.java:599)
    在org.netbeans.spi.project.ui.ProjectOpenedHook $ 1.projectOpened(ProjectOpenedHook.java:84)
[捕获]在org.netbeans.modules.project.ui.OpenProjectList.notifyOpened(OpenProjectList.java:1138)
    在org.netbeans.modules.project.ui.OpenProjectList.access $ 1600(OpenProjectList.java:134)
    在org.netbeans.modules.project.ui.OpenProjectList$LoadOpenProjects.loadOnBackground(OpenProjectList.java:434)
    在org.netbeans.modules.project.ui.OpenProjectList $ LoadOpenProjects.run(OpenProjectList.java:312)
    在org.openide.util.RequestProcessor ​​$ Task.run(RequestProcessor.java:1452)
    在org.openide.util.RequestProcessor ​​$ Processor.run(RequestProcessor.java:2032)


解决方案

通过阅读的ArrayList 的来源,你可以看到, rangeCheck 被实现为

 私人无效rangeCheck(INT指数){
   如果(索引&gt; =大小)
     抛出新IndexOutOfBoundsException异常(outOfBoundsMsg(指数));
 }

所以我的猜测只是去并发。还有就是不要有一个较小的指数虽然有此异常抛出其他明显的方式。

这异常被抛出后,不知何故大小的变化,在一种情况,即


  • 您尝试从其中超过界限列表检索项目

  • 在同一时间另一个线程添加其他元素,以便尺寸在抛出异常的时间增加了大小

  • 例外终于呈现

您可以通过在开始时保留更大的阵列,看它是否仍然发生尝试。只是为了更好地理解:它在同一地点发生的每次?或只是随机?

How can the index be out of bounds when it actually is in bounds as shown by the stacktrace? Although the context may not matter we are working on a Lua parser/VM for an IDE on the Netbeans platform and this keeps creeping up. How can this be? Some strange concurrency issue? Thanks in advance for any insights.

java.lang.IndexOutOfBoundsException: Index: 14, Size: 16
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.get(ArrayList.java:382)
    at org.netbeans.lib.lexer.BatchTokenList.existingToken(BatchTokenList.java:197)
    at org.netbeans.lib.lexer.BatchTokenList.tokenOffset(BatchTokenList.java:150)
    at org.netbeans.api.lexer.TokenSequence.offset(TokenSequence.java:256)
    at com.MYDevelopers.LuaSupportCompiler.TokenManager.getTokenStart(TokenManager.java:230)
    at com.MYDevelopers.LuaSupportCompiler.CompilationUnit.getCurrentLocation(CompilationUnit.java:459)
    at com.MYDevelopers.LuaSupportCompiler.CompilationUnit.expressionImp(CompilationUnit.java:654)
    at com.MYDevelopers.LuaSupportCompiler.CompilationUnit.expression(CompilationUnit.java:647)
    at com.MYDevelopers.LuaSupportCompiler.CompilationUnit.RHSexpression(CompilationUnit.java:643)
    at com.MYDevelopers.LuaSupportCompiler.CompilationUnit.chunk(CompilationUnit.java:1004)
    at com.MYDevelopers.LuaSupportCompiler.CompilationUnit.compile(CompilationUnit.java:164)
    at com.MYDevelopers.LuaSupportCompiler.CompilationUnit.compileIfRequired(CompilationUnit.java:148)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.compile(SourcesManager.java:222)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.compileAndEvaluateIfRequired(SourcesManager.java:210)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addSourceManager(SourcesManager.java:113)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addDirectory(SourcesManager.java:106)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addBootDirectory(SourcesManager.java:80)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.addBaseLibraries(SourcesManager.java:72)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.SourcesManager.<init>(SourcesManager.java:47)
    at com.MYDevelopers.LuaSupport.LuaProject.CompilationManagers.GlobalCompilationManager.addProjectDirectory(GlobalCompilationManager.java:76)
    at com.MYDevelopers.LuaSupport.LuaProject.LuaProject.getSourcesManager(LuaProject.java:309)
    at com.MYDevelopers.LuaSupport.LuaProject.LuaProject$ProjectOpenHookImpl.projectOpened(LuaProject.java:599)
    at org.netbeans.spi.project.ui.ProjectOpenedHook$1.projectOpened(ProjectOpenedHook.java:84)
[catch] at org.netbeans.modules.project.ui.OpenProjectList.notifyOpened(OpenProjectList.java:1138)
    at org.netbeans.modules.project.ui.OpenProjectList.access$1600(OpenProjectList.java:134)
    at org.netbeans.modules.project.ui.OpenProjectList$LoadOpenProjects.loadOnBackground(OpenProjectList.java:434)
    at org.netbeans.modules.project.ui.OpenProjectList$LoadOpenProjects.run(OpenProjectList.java:312)
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1452)
    at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2032)

解决方案

By reading the source of ArrayList, you can see that rangeCheck is implemented as

 private void rangeCheck(int index) {
   if (index >= size)
     throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
 }

so my guesses just go to concurrency. There is not other obvious way to have a smaller index while having this exception thrown.

Somehow size changes after that the exception is thrown, in a situation in which

  • you try to retrieve an item from the list which is over bounds
  • at the same time another thread is adding another element so size increases over the size at the time the exception is thrown
  • the exception is finally rendered

You could try by reserving a bigger array at the beginning to see if it still happens. Just to understand better: does it happen everytime at the same point? or just randomly?

这篇关于与指数14,大小16如何IndexOutOfBounds?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆