也许它看起来像一个非常普通的问题,但我也很惊讶这是如何可能的。 我正在使用以下语句在我的一个类中创建一个对象:
TestVO testVO = new TestVO();
它返回null。但是,当将testVO
对象传递给方法(解析Excel工作表并在VO中设置数据)时,它不会抛出NullPointerException
(在eclipse调试模式下,testVO值显示为null)。当尝试在下一组语句中使用相同的对象时,它会抛出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");
}
}
}
答案 0 :(得分:1)
testVO
不能为null
:
TestVO testVO = new TestVO();
如果您发现它是null
,可能是因为您在变量初始化之前将鼠标悬停在变量上,并且eclipse不会更新显示的值。
您可以添加:
if (testVO == null) {
System.out.println("testVO is null although everyone says it cannot be.");
}
直接在TestVO testVO = new TestVO();
之后,查看是否显示了该消息。
答案 1 :(得分:0)
这不能为testVO指定null。
TestVO testVO = new TestVO();
可能 1)在执行此行之前使用testVO,
或者 2)执行此行后,将其自己设置为null
然后你在它已经为null时使用它。因此,请仔细检查您的代码。
答案 2 :(得分:0)
我认为在你的TestVO
课程中,有被重写的toString()
方法返回null
,这就是为什么在调试模式下你得到null。但实际上你的课程有对象,因为你没有得到NullPointerException
。
我希望这是你问题的部分解决方案