当getFontIndex()API返回负索引时会出现什么情况?

时间:2016-12-29 15:09:15

标签: java apache-poi vaadin vaadin7

我正在使用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中设置为负值

1 个答案:

答案 0 :(得分:0)

发现问题。我的代码不必要地创建了大量(大约40,0000)个Font对象。因此需要40K + fontindexs来存储它们。但是当我看到XSSFCellStle.getFontIndex()方法的源代码时,整数索引的类型转换为short

 @Override
public short getFontIndex() {
    return (short) getFontId();
}

因为我有超过40K的对象,索引值超出了Short数据类型的限制,即32767.所以任何高于32767的索引都是负的短值。我通过将我的Font对象限制在32767范围以下来修复问题