Возможно, это выглядит очень обычным вопросом, но я также удивлен, как это возможно. Я создаю объект в одном из моего класса, используя следующее заявление:java объект для возврата null?
TestVO testVO = new TestVO();
возвращает нуль. Однако при передаче объекта 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");
}
}
}
Пожалуйста, добавьте ** ** точный код – BobTheBuilder
Пожалуйста, проверьте исходный код добавил, также упомянуть точное место, где находится проблема – user3129152
Могли бы вы добавить трассировки стека? –