2013-12-23 8 views
-2

Возможно, это выглядит очень обычным вопросом, но я также удивлен, как это возможно. Я создаю объект в одном из моего класса, используя следующее заявление: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"); 
    } 
} 

}

+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 не обновляет значение и показывает его как null. К сожалению для меня, в той же строке в моем коде, testVo и его один из атрибутов getter метод используется для сравнения, который в действительности бросает NPE. Затмение показывало неправильное значение, показанное для testVO. – user3129152

+0

Спасибо всем за помощь – user3129152

0

Это не может присвоить NULL для testVO.

TestVO testVO = new TestVO(); 

Возможно 1) вы используете testVO прежде, чем эта линия выполнена,
или 2) после того, как эта строка выполняется, вы можете установить ее обнулить себе
, а затем использовать его, когда это null уже есть. Поэтому внимательно проверьте свой код.

+0

Я проверил свой код и на 100% уверен, ничего плохого логически. Исходный код добавлен для вашего ref. – user3129152

0

Я думаю, что в вашем TestVO классе, то перекрывается toString() метод возвращает null, поэтому в режиме вы получаете null.But в действительности есть объект вашего класса, потому что вы не получаете NullPointerException отладки.

Я надеюсь, что это частичное решение вашей проблемы

Смежные вопросы