2014-02-19 4 views
0

У меня есть еще одна проблема с моим кодом. У меня есть ошибка Исключение из темы "main" java.lang.NullPointerExceptionПроблема с нулевым указателем в POI

, который, как я понимаю, является вопросом инициализации. Однако я не знаю, как инициализировать объект «строка» HSSFRow (netbean говорит, что «строка» должна быть инициализирована).

Строка ошибки - это 10-я строка перед циклом «для». когда я запускаю код с целым значением, равным 4 для переменной «cols», все в порядке.

здесь сводном код

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); 

я попытался поймать исключения нулевого указателя, но он не работает, как хорошо. Могу ли я помочь? спасибо

+0

почему вы не используете 'попытаться поймать 'блок ?! –

+1

HSSFRow row;/* Инициализация */является объявлением не инициализацией. ваша строка равна нулю в точке, где вы получаете ошибку. – wxyz

ответ

0

Вы объявляете переменную row, но не инициализируете ее. Поэтому, когда вы звоните row.getLastCellNum();, он по-прежнему null. И вы не можете вызвать метод на объекте, который равен null. Он выдаст ошибку, которую вы получите!

Чтобы решить проблему, присвойте значение переменной, как определено, с какой целью она должна служить. К выдержке, которую вы даете, я мог только догадываться, что это должно быть!

Редактировать: как вы используете cols в условии завершения вашего цикла вложенного цикла, переместите объявление переменной непосредственно перед циклом. Также рекомендуется использовать минимальный объем переменных.

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

Спасибо за все ответы. Предложение Никиса сделало трюк! мы увидим, как он работает – user3315138

+0

Хотя он прав, я считаю, что создание экземпляра не требуется. Вы не должны инициализировать переменные ради их инициализации, но потому, что это правильно. Здесь переменная не нужна в объявленной области. Только инициализация его в цикле, скорее всего, (по крайней мере, я так думаю) позволит автоматически оптимизировать код для перекодировки переменной по мере необходимости. Всегда используйте самый маленький объем! – Eric

0

Попробуйте разместить эту строку int cols = row.getLastCellNum(); после row = sheet.getRow(rowIndex);. Вам нужно получить строку из определенного листа, чтобы иметь возможность выполнять любую операцию с строкой.

1

Вы можете инициализировать его, получив первую строку вашего листа:

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

Попробуйте поставить «int cols = row.getLastCellNum();» после инициализации в петлю, как

for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) 
     { 
      row = sheet.getRow(rowIndex); 
      cols = row.getLastCellNum(); 
      .... 
} 
Смежные вопросы