POI中的空指针问题

时间:2014-02-19 07:56:42

标签: java apache-poi

我的代码还有另一个问题。我有一个错误     线程“main”中的异常java.lang.NullPointerException

我理解的是初始化问题。但是我不知道如何初始化HSSFRow对象'row'(netbean表示'row'必须初始化)。

错误行是'for'循环之前的第10行。当我为变量'cols'运行像4这样的整数值的代码时,一切都很好。

这里是摘要代码

try{
        InputStream input = new BufferedInputStream(new FileInputStream("C:/Bookessais.xls"));
        POIFSFileSystem fs = new POIFSFileSystem( input );
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFRow row;/* Initialisation*/
        HSSFCell cell = null;
        int theColIndexYouWant = 3;
        int cols = row.getLastCellNum();// ERROR LINE

        for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) 
        {
             row = sheet.getRow(rowIndex);
             if (row != null) {
                 double key = 0.0;
                 for (int colIndex = 0; colIndex < cols; colIndex++) 
                 {
                     if (colIndex == theColIndexYouWant) 
                     {
                       int colIndex1 = colIndex - 3;
                       String key1;        

                       cell = row.getCell(colIndex);
                       if(HSSFCell.CELL_TYPE_NUMERIC== cell.getCellType())

                          key = cell.getNumericCellValue();

                     System.out.println("\n");
                     System.out.println(" the key is---" +key);
                     System.out.println(" initial date is: "+ exDate);
                     if(key == exDate){ System.out.println(" IT IS A MATCH!");}
                     else  System.out.println(" NOT A MATCH");

                     cell = row.getCell(colIndex1);

                      key1 = cell.getStringCellValue();
                      if(HSSFCell.CELL_TYPE_STRING==cell.getCellType())
                      System.out.println(" the task is: " +key1+ " Line: "+rowIndex);        
                     }

              }

        }     

     }


    }
         catch ( IOException ex ) {
        ex.printStackTrace(System.out);

我试图捕获Null指针异常,但它也不起作用。我可以帮忙吗? 感谢

4 个答案:

答案 0 :(得分:1)

您可以通过获取工作表的第一行来初始化它:

HSSFRow row = sheet.getRow(sheet.getFirstRowNum());

答案 1 :(得分:0)

您声明了row变量但从未初始化它。因此,当您致电row.getLastCellNum();时,它仍然是null。并且您无法在null的对象上调用方法。它会抛出你收到的错误!

要解决问题,请将值归因于您的变量,并根据其服务目的进行定义。通过摘录你我只能猜到它应该是什么!

编辑:因为你只在嵌套for循环的终止条件中使用cols,所以在循环之前移动变量的声明。使用变量的最小范围也是一种很好的做法。

double key = 0.0;
int cols = row.getLastCellNum();
for (int colIndex = 0; colIndex < cols; colIndex++)
// and so on.

答案 2 :(得分:0)

尝试在int cols = row.getLastCellNum();之后放置此行row = sheet.getRow(rowIndex);。您需要从已定义的工作表中获取一行才能对该行执行任何操作。

答案 3 :(得分:0)

尝试在初始化之后将“int cols = row.getLastCellNum();”放入循环中,如

for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) 
        {
             row = sheet.getRow(rowIndex);
             cols = row.getLastCellNum();
             ....
}