outOfMemoryError: куча Java - PullRequest
       11

outOfMemoryError: куча Java

0 голосов
/ 07 марта 2012
public class seventhma {

    XSSFSheet m_sheet;
    int m_iNbRows;
    int m_iCurrentRow = 0;
    private static final String JAVA_TOSTRING = "EEE MMM dd HH:mm:ss zzz yyyy";

    public seventhma(XSSFSheet sheet) {
        m_sheet = sheet;
        m_iNbRows = sheet.getPhysicalNumberOfRows();
    }

    /*
     * Returns the contents of an Excel row in the form of a String array.
     * 
     * @see com.ibm.ccd.common.parsing.Parser#splitLine()
     */
    public String[] splitLine() throws Exception {
        // if (m_iCurrentRow == m_iNbRows)
        // return null;

        XSSFRow row = m_sheet.getRow(m_iCurrentRow);
        if (row == null) {
            return null;
        } else {
            int cellIndex = 0;
            int noOfCells = row.getPhysicalNumberOfCells();
            String[] values = new String[noOfCells];
            short firstCellNum = row.getFirstCellNum();
            short lastCellNum = row.getLastCellNum();

            if (firstCellNum >= 0 && lastCellNum >= 0) {
                for (short iCurrent = firstCellNum; iCurrent < lastCellNum; iCurrent++) {
                    XSSFCell cell = (XSSFCell) row.getCell(iCurrent);
                    if (cell == null) {
                        values[iCurrent] = "";
                        cellIndex++;
                        continue;
                    } else {
                        switch (cell.getCellType()) {
                            case XSSFCell.CELL_TYPE_NUMERIC:
                                double value = cell.getNumericCellValue();
                                if (DateUtil.isCellDateFormatted(cell))

                                {
                                    if (DateUtil.isValidExcelDate(value)) {
                                        Date date = DateUtil.getJavaDate(value);
                                        SimpleDateFormat dateFormat = new SimpleDateFormat(JAVA_TOSTRING);
                                        values[iCurrent] = dateFormat.format(date);
                                    } else {
                                        // throw new
                                        // Exception("Invalid Date value found at row number "
                                        // +
                                        // row.getRowNum()+" and column number "+cell.getCellNum());
                                    }
                                } else {
                                    values[iCurrent] = value + "";
                                }
                                break;

                            case XSSFCell.CELL_TYPE_STRING:
                                values[iCurrent] = cell.getStringCellValue();
                                break;

                            case XSSFCell.CELL_TYPE_BLANK:
                                values[iCurrent] = null;
                                break;

                            default:
                                values[iCurrent] = null;
                        }
                    }
                }
            }
            m_iCurrentRow++;
            return values;
        }

    }

    public static void main(String args[]) {
        XSSFWorkbook workBook = null;
        File file = new File("E:\\Local\\Local2.xlsx");
        InputStream excelDocumentStream = null;
        try {
            excelDocumentStream = new FileInputStream(file);
            // POIFSFileSystem fsPOI = new POIFSFileSystem(new
            // BufferedInputStream(excelDocumentStream));
            BufferedInputStream bfs = new BufferedInputStream(excelDocumentStream);
            workBook = new XSSFWorkbook(bfs);
            seventhma parser = new seventhma(workBook.getSheetAt(0));
            String[] res = null;
            while ((res = parser.splitLine()) != null) {
                for (int i = 0; i < res.length; i++) {
                    System.out.println("[" + res[i] + "]" + "\t");

                }
                System.out.println(res.length);

            }
            bfs = null;
            excelDocumentStream.close();

        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }

    }
}

Эта программа выдает кучу Java из пространства , и при загрузке листа Excel, содержащего столбцы 16 , она выдает ArrayIndexOutOfBoundException.
Я увеличил объем памяти до затмения -Xmx1600m но это тоже не сработало.

1 Ответ

2 голосов
/ 07 марта 2012

Вы получаете ArrayIndexOutOfBoundException для массива values, потому что вы используете row.getPhysicalNumberOfCells() для определения его размера. Но row.getPhysicalNumberOfCells() будет считать только те ячейки, которые фактически заполнены в файле.

Например, если вы создаете лист Excel и заполняете только столбцы A, C и F и вообще не касаетесь других ячеек row.getPhysicalNumberOfCells() вернет 3.
Но вы перебираете все ячейки, получая row.getFirstCellNum() и row.getLastCellNum(). Так что values[iCurrent] обязательно выйдет за пределы, как только вы достигнете ячейки F.

Относительно проблемы OutOfMemory: XSSF использует много памяти. Попробуйте перенести виртуальную машину на максимально возможное количество памяти для вашей машины. Или, если вы просто читаете файлы, попробуйте использовать API eventmodel вместо usermodel (например, SAX vs. DOM). Apache POI Streaming vs. In memory

...