我目前不熟悉使用Java的TestNG。我正在尝试使用poi Apache 4.0从Excel读取值
public static void read2dRowExcelFile2(String filePath) throws IOException {
try {
FileInputStream fis = new FileInputStream(new File(filePath));
HSSFWorkbook wb = new HSSFWorkbook(fis);
HSSFSheet sheet = wb.getSheet("PerLocation");
Object[][] tableArr = new String[sheet.getLastRowNum() + 1][];
int arrNo1 = 0;
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
int arrNo2 = 0;
for (int j = 0; j < row.getLastCellNum(); j++) {
String cellValue = row.getCell(j).getStringCellValue();
System.out.println(acellValue);
//tableArr[arrNo1][arrNo2] = cellValue;
System.out.println("test");
arrNo2++;
}
arrNo1++;
}
wb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
上面的代码在控制台上显示值。我的目标是将这些值存储到对象。像[{London,Blue},{Tokyo,Yellow},{Manila,Red}]之类的东西,所以我可以将它们传递给dataProvider
如果我运行上面的代码,它将显示: 伦敦 蓝色 东京 黄色 马尼拉 红色
但是如果我取消注释此行:
//tableArr[arrNo1][arrNo2] = cellValue;
仅输出: 伦敦
03-08-19:启用堆栈跟踪后,它说:java.lang.NullPointerException 与此代码有关:
tableArr[arrNo1][arrNo2] = cellValue;
答案 0 :(得分:0)
根据您的代码
Object[][] tableArr = new String[sheet.getLastRowNum() + 1][];
在数组初始化时,您正在设置第一维的大小,而不是第二维的大小。访问之前,您需要为第二维初始化数组。
请参考以下示例:
public static void main(String[] args) {
//read rows size
int numOfRows = 3;
String[][] tableArr = new String[numOfRows][];
for (int row = 0; row <3; row++) {
//read columns size
int numOfColsInRow = 3;
tableArr[row]=new String[numOfColsInRow];
for (int col = 0; col < 3; col++) {
String cellValue = "cell-" + row+""+col;//read cell value
tableArr[row][col] = cellValue;
}
}
for(String[] row: tableArr) {
System.out.println(Arrays.toString(row));
}
}
运行以上代码并生成预期输出:
[cell-00, cell-01, cell-02]
[cell-10, cell-11, cell-12]
[cell-20, cell-21, cell-22]
要重现您的问题,您可以尝试在注释行中初始化代码中第二维的数组,您将看到Exception in thread "main" java.lang.NullPointerException
//tableArr[row]=new String[numOfColsInRow];
为避免所有此类问题,您还可以检查退出的TestNG data-provider extension是否满足您的需求。