什么原因导致这段代码中的'NullPointerException',读取Excel单元格?

时间:2010-07-07 08:03:59

标签: java nullpointerexception apache-poi

我正在使用 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 个答案:

答案 0 :(得分:3)

你的数组偏移是否可能被一个(对于行循环)?

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

而不是从偏移量1开始,从0开始。这更有意义(并匹配您的列循环)。

在这种情况下,HSSFRow row = sheet.getRow(r)的结果;可以为null(顺便提一句,你应该检查)。

修改#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 ...:

                     }
                 }
             }
      }
 }

如果你看the JavaDoc这很重要

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

返回物理定义的行数( NOT 表单中的行数)

修改#2: 为了进一步调试,请将以下try / catch放在for循环中。

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

请将评论粘贴到此答案或使用此输出的结果更新原始答案。

答案 1 :(得分:1)

我不解释你的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();
       ....
    }
}

答案 2 :(得分:0)

我猜单元格可能为null,但您应该使用调试器找出异常位置。

答案 3 :(得分:0)

根据给出的代码,sheetrowcell将为空。异常堆栈跟踪本身应该告诉您导致问题的确切行。

首先想到的是,您获得了工作表中的实际行数,但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.