При чтении данных с листа Excel получено исключение NullPointerException

#java #vba #excel #selenium-webdriver

#java #vba #excel #selenium-webdriver

Вопрос:

Я пытаюсь прочитать данные с листа Excel, но получаю исключение NullPointerException каждый раз при чтении данных с индексом ячейки = 6. Введите while(значение!= null), чтобы избежать нулевых значений, но все равно получил исключение без какого-либо вывода. Я помещаю снимок экрана листа Excel, откуда я пытаюсь получить данные. введите описание изображения здесь

 Code-
package com.selenium;

import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.IOException;

public class Exxcel {
  public static void main(String[] args) throws Exception,NullPointerException{
    //WebDriver driver= new FirefoxDriver();
    //WebElement wb;
    try{
    FileInputStream file= new FileInputStream("C:\Documents and Settings\OMEGA\Desktop\Test Planning And Documents\Automation Data.xlsx");
    Workbook data=WorkbookFactory.create(file);
    Sheet sheet=data.getSheet("Sheet1");
    for(int i=1;i<=sheet.getLastRowNum();i  ){
        Row row= sheet.getRow(i);
        int j=0;
        String value=row.getCell(j).getStringCellValue();
        while(value != null){ 
        System.out.println(value);
        }//while
        while(value == null){
            j  ; 
         }  
    }//for

         /*while(j1==9){
             String value=row.getCell(j1).getStringCellValue();
             System.out.println(value);
             }//while2
             */
    }catch(NullPointerException n){n.printStackTrace();
        System.out.println("Null");
        }// catch
    }//main
 }//class


StackTrace-
Null
java.lang.NullPointerException
at com.selenium.Exxcel.main(Exxcel.java:22)
  

Ответ №1:

Этого недостаточно, чтобы проверить это row.getCell(j).getStringCellValue() != null . Вы должны это проверить row.getCell(j) != null .

Кроме того, ваши циклы while не имеют смысла :

Первый либо ничего не сделает, либо напечатает значение навсегда (поскольку вы не меняете значение внутри цикла).

     while(value != null) { 
        System.out.println(value);
    }//while
  

Второй либо ничего не сделает, либо увеличит j навсегда (поскольку вы не меняете значение внутри цикла).

     while(value == null) {
        j  ; 
    } 
  

Я предлагаю вам заменить их следующим кодом :

 Row row = sheet.getRow(i);
if (row != null) {
    for (int j = 0; j < row.getLastCellNum(); j  ) {
        if (row.getCell(j) != null) {
            if (row.getCell(j).getCellType() == CELL_TYPE_STRING) {
                String value=row.getCell(j).getStringCellValue();
                if(value != null) { 
                    System.out.println(value);
                }
            }
        }   
    }
}
  

Комментарии:

1. Изменился ли код, как вы сказали, но все еще получал исключение без какого-либо значения / вывода

2. @Shantanu В какой строке вы получаете исключение? Возможно, вам также следует проверить эту строку!= null.

3. @EranSir это сработало, когда я ввел строку!= null…. Но я получаю вывод в одной строке. Возможно ли получить значение каждой ячейки независимо. Например, строка s1 = значение ячейки 1, строка s2 = значение второй ячейки

4. @Shantanu Вы ничего не получите, создав массив внутри цикла, поскольку значения, прочитанные в предыдущих столбцах, будут переопределены. Кроме того, в вашем случае не рекомендуется использовать массив, поскольку вы заранее не знаете, сколько строк вам пришлось бы хранить в этом массиве. Инициализировать массив, содержащий i элементов, не имеет смысла, поскольку i — это просто индекс текущей строки.

5. @Shantanu в начале (перед тем, как вы начнете читать строки), сделайте List<String> list = new ArrayList<String>() ; Затем делайте list.add(value) каждый раз, когда вы считываете новое значение из файла.