2013-12-23 104 views
-2

也许它看起来像一个非常普通的问题,但我也很惊讶这是如何可能的。 我使用下面的语句在我班上的一个创建对象: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"); 
    } 
} 

}

+7

的部分解决方案请加上** **确切代码 – BobTheBuilder

+0

请查看源代码加入也不在话下确切位置是问题 – user3129152

+0

难道你还可以添加堆栈跟踪? –

回答

1

testVO不能null此行之后:

TestVO testVO = new TestVO(); 

如果你看到它是null,也许那是因为你在它悬停在初始化之前的变量,显示日食不更新值。

您可以添加:

if (testVO == null) { 
    System.out.println("testVO is null although everyone says it cannot be."); 
} 

直接TestVO testVO = new TestVO();后,看看是否被显示的消息。

+0

你是对的whoAmI。 eclipse不会更新该值并将其显示为空。不幸的是,在我的代码的同一行,testVo和它的一个属性getter方法用于比较实际抛出NPE。 testVO显示日食显示错误值。 – user3129152

+0

谢谢大家的帮助 – user3129152

0

这不能指定为null,testVO。

TestVO testVO = new TestVO(); 

大概1)执行到这行之前,您使用testVO,
2)执行此行后,将其设置为null自己
,然后你使用它时,它的已经为null。所以仔细检查你的代码。

+0

我检查了我的代码,100%确定,逻辑上没有任何错误。源代码被添加为您的参考。 – user3129152

0

我想在你的TestVO类中,有被重写toString()方法返回null,这就是为什么在调试模式下你得到null.But在现实中有你的类的对象,因为你没有得到NullPointerException

我希望这是你的问题