我正在使用vaadin电子表格。在我的程序中,我正在读取存储在db中的元数据,如isBold,isItalic等,并根据元数据在单元格上应用这些斜体,粗体等样式。应用这些样式后,我必须使用spreadsheet.getSpreadsheetStyleFactory()刷新单元格.cellStyleUpdated(cell,true); (Vaadin电子表格api)。这个api有时会失败抛出ArrayIndexOutOFBoundsException,可以在下面找到
引起:java.lang.ArrayIndexOutOfBoundsException:-32768 at java.util.ArrayList.elementData(ArrayList.java:400)[rt.jar:1.7.0_80] at java.util.ArrayList.get(ArrayList.java:413)[rt.jar:1.7.0_80] 在org.apache.poi.xssf.model.StylesTable.getFontAt(StylesTable.java:386)[seqnc-common-jar-1.0.0.jar:] 在org.apache.poi.xssf.usermodel.XSSFCellStyle.getFont(XSSFCellStyle.java:557)[seqnc-common-jar-1.0.0.jar:] 在com.vaadin.addon.spreadsheet.XSSFColorConverter.colorStyles(XSSFColorConverter.java:97)[seqnc-common-jar-1.0.0.jar:] 在com.vaadin.addon.spreadsheet.SpreadsheetStyleFactory.addCellStyleCSS(SpreadsheetStyleFactory.java:594)[seqnc-common-jar-1.0.0.jar:] 在com.vaadin.addon.spreadsheet.SpreadsheetStyleFactory.cellStyleUpdated(SpreadsheetStyleFactory.java:461)[seqnc-common-jar-1.0.0.jar:]
这里发生的事情是XssfCellStyle以某种方式具有负索引-32768,它被用作ArrayList中的索引。
我只是想知道在什么情况下fontIndex将在XssfCellStyle中设置为负值
答案 0 :(得分:0)
发现问题。我的代码不必要地创建了大量(大约40,0000)个Font对象。因此需要40K + fontindexs来存储它们。但是当我看到XSSFCellStle.getFontIndex()方法的源代码时,整数索引的类型转换为short
@Override
public short getFontIndex() {
return (short) getFontId();
}
因为我有超过40K的对象,索引值超出了Short数据类型的限制,即32767.所以任何高于32767的索引都是负的短值。我通过将我的Font对象限制在32767范围以下来修复问题