Что вызывает исключение NullPointerException в этом фрагменте кода при чтении ячеек Excel? - PullRequest
1 голос
/ 07 июля 2010

Я использую Apache POI для чтения Excel.Меня попросили сохранить ячейки в MySQL 5.1.Пока я читаю ячейки Excel, меня выбросило NullPointerException.Это мой фрагмент кода:

  int rows = sheet.getPhysicalNumberOfRows();

  for(int r = 1; r<rows; r++) {
            HSSFRow row = sheet.getRow(r);
            int cols = row.getLastCellNum();

            for(int c=0; c < cols; c++) {
                HSSFCell cell = row.getCell(c, Row.CREATE_NULL_AS_BLANK);

                switch(cell.getColumnIndex())    {

                   case 0:
                       ....
                       ....

                   case 1:
                       ....
                       ....


                   case ...:
                       ....
                       ....

                }
            }
  }

  // Here comes the code to insert into DB

Если кто-то может определить, где он возник, отправьте как можно скорее.Если я оставлю какую-то логику, тебе нужно просто спросить меня ...

Ответы [ 4 ]

3 голосов
/ 07 июля 2010

Возможно ли, что смещение вашего массива отключено на единицу (для цикла строки)?

for(int r = 1; r<rows; r++) {
  HSSFRow row = sheet.getRow(r);

вместо того, чтобы начинаться со смещения 1, начинать с 0. Это имеет больше смысла (и соответствует вашему столбцу)loop).

В этом случае результат HSSFRow row = sheet.getRow (r);может быть нулевым (что, кстати, вы должны проверить).

Редактировать # 1: Например:

  if (sheet == null) {
        return;
  }

  int rows = sheet.getPhysicalNumberOfRows();
  for(int r = 1; r<rows; r++) {
        HSSFRow row = sheet.getRow(r);
        if (row != null) {
             int cols = row.getLastCellNum();

             for(int c=0; c < cols; c++) {
                 HSSFCell cell = row.getCell(c, Row.CREATE_NULL_AS_BLANK);

                 if (cell != null) {
                    switch(cell.getColumnIndex())    {
                         case 0:
                         case 1:
                         case ...:

                     }
                 }
             }
      }
 }

Если вы посмотрите на JavaDoc , это важно

public int getPhysicalNumberOfRows()  {
  return _rows.size();
}

Возвращает количество физически определенных строк ( НЕ количество строк в листе)

Правка # 2: Радидля дальнейшей отладки, пожалуйста, поместите следующую попытку / поймайте вокруг вашего цикла for.

try {
     // Your for loop code here
} catch (Exception x) {
     x.printStackTrace();
}

Пожалуйста, вставьте комментарий к этому ответу или обновите свой оригинальный ответ с результатом этого вывода.

1 голос
/ 07 июля 2010

Я не объясняю ваш NPE, но предлагаю вам другой способ перебора рабочей книги, вы пробовали это?

for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
    final Sheet sheet = workbook.getSheetAt(i);
    final Iterator<Row> rows = sheet.rowIterator();
    if (rows.hasNext()) {
       final Row header = rows.next();
       ....
    }
}
0 голосов
/ 07 июля 2010

Исходя из указанного кода, sheet, row или cell будут нулевыми.Сама трассировка стека исключений должна точно указывать, какая строка вызывает проблему.

Первые мысли, что вы получаете физическое количество строк в листе, но getRow() дает вам логическую строку.Вы можете захотеть использовать getFirstRowNum() и getLastRowNum(), которые, кажется, возвращают логические строки.

Но это только мои мысли.Прежде чем я смогу сказать наверняка, нужна дополнительная информация.


Чтобы получить трассировку стека с учетом вашего исключения npe, используйте:

npe.printStackTrace();

или:

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
npe.printStackTrace(pw);
pw.flush();
sw.flush();
// sw.toString(); to get a string for putting into a text box or something else.
0 голосов
/ 07 июля 2010

Я думаю, ячейка может быть нулевой, но вы должны использовать отладчик, чтобы выяснить место исключения.

...