java对象实例化返回null?

时间:2013-12-23 10:05:36

标签: java object null

也许它看起来像一个非常普通的问题,但我也很惊讶这是如何可能的。 我正在使用以下语句在我的一个类中创建一个对象:

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");
    }
}

}

3 个答案:

答案 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

我希望这是你问题的部分解决方案