如果堆栈轨迹显示实际处于边界内,索引如何超出界限?虽然上下文可能并不重要,但我们正在为Netbeans平台上的IDE开发一个Lua解析器/ VM,并且这种情况不断增加。怎么会这样?一些奇怪的并发问题?提前感谢任何见解。
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)
答案 0 :(得分:9)
通过阅读ArrayList
的来源,您可以看到rangeCheck
已实施为
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
所以我的猜测只是去并发。抛出此异常时,没有其他明显的方法可以使用较小的索引。
在某种情况下,在某种情况下,在
的情况下抛出异常,大小会发生变化size
会在抛出异常时增加大小答案 1 :(得分:0)
我在sun.print.Win32MediaSize
中也有同样的异常,并且在答案的帮助下,这是一个并发问题。
日志输出:
java.lang.IndexOutOfBoundsException: Index: 14, Size: 15
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at sun.print.Win32MediaSize.findMediaName(Win32PrintService.java:1742)
at sun.print.Win32PrintService.initMedia(Win32PrintService.java:418)
at sun.print.Win32PrintService.getSupportedAttributeValues(Win32PrintService.java:1367)
at sun.print.RasterPrinterJob.updatePageAttributes(RasterPrinterJob.java:548)
at sun.print.RasterPrinterJob.setPrintable(RasterPrinterJob.java:997)
at net.sf.jasperreports.engine.export.JRPrintServiceExporter.exportReport(JRPrintServiceExporter.java:467)
public Win32MediaSize(String name, int dmPaper)
如果主题1 将字符串添加到winStringTable
,但不要将对象添加到winEnumTable
findMediaName
,则会导致indexoutofbounds
异常。代码吼叫
package sun.print;
import java.util.ArrayList;
import javax.print.attribute.EnumSyntax;
import javax.print.attribute.standard.MediaSize;
import javax.print.attribute.standard.MediaSizeName;
class Win32MediaSize extends MediaSizeName {
private static ArrayList winStringTable = new ArrayList();
private static ArrayList winEnumTable = new ArrayList();
private static MediaSize[] predefMedia;
private int dmPaperID; // driver ID for this paper.
private Win32MediaSize(int x) {
super(x);
}
private synchronized static int nextValue(String name) {
winStringTable.add(name);
return (winStringTable.size()-1);
}
public static synchronized Win32MediaSize findMediaName(String paramString) {
int i = winStringTable.indexOf(paramString);
if (i != -1) {
return ((Win32MediaSize) winEnumTable.get(i));
}
return null;
}
public static MediaSize[] getPredefMedia() {
return predefMedia;
}
public Win32MediaSize(String name, int dmPaper) {
super(nextValue(name));
dmPaperID = dmPaper;
winEnumTable.add(this);
}
private MediaSizeName[] getSuperEnumTable() {
return (MediaSizeName[])super.getEnumValueTable();
}
static {
Win32MediaSize localWin32MediaSize = new Win32MediaSize(-1);
MediaSizeName[] arrayOfMediaSizeName = localWin32MediaSize
.getSuperEnumTable();
if (arrayOfMediaSizeName != null) {
predefMedia = new MediaSize[arrayOfMediaSizeName.length];
for (int i = 0; i < arrayOfMediaSizeName.length; ++i)
predefMedia[i] = MediaSize
.getMediaSizeForName(arrayOfMediaSizeName[i]);
}
}
int getDMPaper() {
return dmPaperID;
}
protected String[] getStringTable() {
String[] nameTable = new String[winStringTable.size()];
return (String[])winStringTable.toArray(nameTable);
}
protected EnumSyntax[] getEnumValueTable() {
MediaSizeName[] enumTable = new MediaSizeName[winEnumTable.size()];
return (MediaSizeName[])winEnumTable.toArray(enumTable);
}
}
编辑:
我正在使用5个线程来调用java print api,并且有时会遇到相同的异常。我研究了很多,直到这里我看到了concurreny点
我通过仅用1个线程初始化printService来解决我的问题,我在这里记录它以提醒类sun.print.Win32MediaSize
中有一个concurreny问题,如上所述。