也许它看起来像一个非常普通的问题,但我也很惊讶这是如何可能的。 我使用下面的语句在我班上的一个创建对象:java对象实例化返回null?
TestVO testVO = new TestVO();
返回null。但是,在将testVO
对象传递给方法(解析Excel工作表并将数据设置为VO)时,它不会抛出NullPointerException
(在eclipse调试模式下,testVO值显示为空)。当试图在下一组语句中使用相同的对象时,它会抛出NPE。
我也很惊讶,为什么上面的语句返回null,并没有分配内存给对象。
请注意在另一个类中创建TestVO
类对象时,它工作正常。这只发生在一个特定的班级。
下面是类代码:
public class SheetParser {
public SheetParser() {
}
public void parseSheet(Workbook workbook, List<TestVO> list) {
TestVO testVO = null;
Row row = null;
Cell cell = null;
String header = null;
boolean hasHeaderRow = false;
boolean hasDataRow = false;
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> rows = sheet.rowIterator();
List<String> headers = new ArrayList<String>();
try {
while (rows.hasNext()) {
row = rows.next();
if (row.getRowNum() == 0) {
hasHeaderRow = true;
int i = 0;
while (true) {
try {
cell = row.getCell(i++);
if (cell == null) {
break;
}
cell.setCellType(Cell.CELL_TYPE_STRING);
header = cell.getStringCellValue();
if (header == null || "".equals(header.trim())) {
break;
}
headers.add(header.toUpperCase());
} catch (NullPointerException e) {
break;
}
}
validateHeaders(headers);
} else {
hasDataRow = true;
testVO = new TestVO();
// HERE the above statement failed to initialized the object
// and shows the testVO as null
// But below in setRowData method, value is set in testVo
// object after reading from excel sheet
boolean error = setRowData(testVO, headers, row, errorList);
if (!error) {
list.add(testVO);
}
}
}
} catch (Exception e) {
errorList.add(e.getMessage());
}
if (!hasHeaderRow) {
errorList.add("Uploaded Excel file is invalid, headers missing");
}
if (!hasDataRow) {
errorList
.add("Uploaded Excel file is invalid, data row(s) are missing.");
}
}
private boolean setRowData(TestVO testVO, List<String> headersList,
Row row, List<String> errors) {
boolean error = false;
boolean allCellsBlank = true;
List<String> errorList = new ArrayList<String>();
String rowPrefixText = "At Row #";
for (int i = 0; i < headersList.size(); i++) {
String header = headersList.get(i);
String value = "";
try {
row.getCell(i).setCellType(Cell.CELL_TYPE_STRING);
value = row.getCell(i).toString().trim();
} catch (NullPointerException e) {
// do nothing
}
try {
if (header.equalsIgnoreCase("ABC")) {
if (StringUtils.isBlank(value)) {
errorList.add(rowPrefixText + row.getRowNum()
+ ", ABC is required.");
error = true;
} else {
testVO.setAbc(value);
allCellsBlank = false;
}
} else if (header.equalsIgnoreCase("XYZ")) {
if (StringUtils.isBlank(value)) {
errorList.add(rowPrefixText + row.getRowNum()
+ ", XYZ is required.");
error = true;
} else {
testVO.setXyz(value);
allCellsBlank = false;
}
}
} catch (Exception e) {
errorList.add(rowPrefixText + row.getRowNum()
+ ", incorrect data/format in column:" + header);
error = true;
}
}
if (allCellsBlank) {
error = true;
} else if (!errorList.isEmpty()) {
errors.addAll(errorList);
}
return error;
}
private void validateHeaders(List<String> headersList) throws Exception {
if (!headersList.contains("ABC")) {
throw new Exception("Invalid Headers - missing ABC");
} else if (!headersList.contains("XYZ")) {
throw new Exception("Invalid Headers - missing XYZ");
}
}
}
的部分解决方案请加上** **确切代码 – BobTheBuilder
请查看源代码加入也不在话下确切位置是问题 – user3129152
难道你还可以添加堆栈跟踪? –