我目前刚接触使用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();
}
}
上面的代码显示控制台上的值。我的目标是将这些值存储到Object。像[{London,Blue},{Tokyo,Yellow},{Manila,Red}]之类的东西,所以我可以将它们传递给dataProvider
如果我运行上面的代码,它会显示:London BLue Tokyo Yellow Manila Red
但如果我取消注释这一行:
//tableArr[arrNo1][arrNo2] = cellValue;
输出仅为:伦敦
03-08-19:启用stacktrace后,它说:java.lang.NullPointerException与此代码有关:
tableArr[arrNo1][arrNo2] = cellValue;
从你的代码,
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满足您的需求。