2011-09-06 2 views
2

무엇이 원인인지 알 수 없습니다. 아래에 첨부 된 함수에서 XML 파일에서 올바르게 읽히는 세 개의 문자열과 "문제"로 표시된 세 개의 문자열이 있는데이 모두가 Null 포인터 예외를 발생시킵니다. 그것들은 처음 세 가지와 정확히 같은 방식으로 이루어집니다. 내가 시도한 몇 가지에 전화를 변경 포함이 더 이상 널 (null) 포인터 예외가 발생하지 않습니다Java DOM Parser는 일부 문자열에는 null 포인터를 반환하지만 다른 문자열에는 null 포인터를 반환합니다.

act.RemainingLateFinishDate = new DateTime(initElement.getElementsByTagName("RemainingLateFinishDate").item(0).getNodeValue()); 

, 대신에 똑같이 쓸모가 빈 문자열을 반환 것으로 보인다. 내가 시도한 또 다른 것은 모든 DOM 요소를 JODA DateTime 생성자에서 가져 오는 것이 었습니다. JODA DateTime 생성자는 여러분이 알듯이 약간의 차이를 만들지 않았습니다. 여기

함수입니다 : 정말 긴 을 때문에

private Activity getActivity(Element initElement){//collect activity data from xml 
    Activity act = new Activity(); 
    act.setName(initElement.getElementsByTagName("Name").item(0).getChildNodes().item(0).getNodeValue()); 
    act.OriginalDuration = Integer.parseInt(initElement.getElementsByTagName("PlannedDuration").item(0).getChildNodes().item(0).getNodeValue()); 
    act.RemainingDuration = Integer.parseInt(initElement.getElementsByTagName("RemainingDuration").item(0).getChildNodes().item(0).getNodeValue()); 
    act.ActualDuration = Integer.parseInt(initElement.getElementsByTagName("ActualDuration").item(0).getChildNodes().item(0).getNodeValue()); 

    act.EACDuration = act.RemainingDuration + act.ActualDuration; 
    if(act.EACDuration>act.OriginalDuration)act.ActivitySlippage = true; 
    else act.ActivitySlippage = false; 
    if(act.EACDuration<=act.OriginalDuration)act.ActivityPerformedWell = true; 
    else act.ActivityPerformedWell = false; 

    //Problem============================================================ 
    act.RemainingLateFinishDate = new DateTime(initElement.getElementsByTagName("RemainingLateFinishDate").item(0).getChildNodes().item(0).getNodeValue()); 
    act.RemainingEarlyFinishDate = new DateTime(initElement.getElementsByTagName("RemainingEarlyFinishDate").item(0).getChildNodes().item(0).getNodeValue()); 
    act.PlannedFinishDate = new DateTime(initElement.getElementsByTagName("PlannedFinishDate").item(0).getChildNodes().item(0).getNodeValue()); 
    //=================================================================== 

    act.Float1 = new Duration(act.RemainingEarlyFinishDate,act.RemainingLateFinishDate); 
    act.Float2 = new Duration(act.PlannedFinishDate,act.RemainingLateFinishDate); 
    if(act.Float1.isLongerThan(act.Float2))act.TotalFloat = act.Float2; 
    else act.TotalFloat = act.Float1; 

    if(act.TotalFloat.isShorterThan(Duration.ZERO)||act.TotalFloat.isEqual(Duration.ZERO))act.CriticalActivity = true; 
    if(act.TotalFloat.isShorterThan(Duration.ZERO))act.NegativeFloatActivity = true; 

    return act; 
} 

내가 XML 파일을 포함 할 수 없습니다. 내가 어딘가에 게시하기를 원한다면 그 우려를 표현해주십시오. 그러나 참조하는 모든 요소가 올바른 노드 아래에 있어야한다고 말할 수 있습니다.

감사합니다.

편집 (일부 XML)

<Activity> 
       <ActualDuration>0</ActualDuration> 
       <ActualFinishDate xsi:nil="true" /> 
       <ActualLaborCost>0</ActualLaborCost> 
       <ActualLaborUnits>0</ActualLaborUnits> 
       <ActualNonLaborCost>0</ActualNonLaborCost> 
       <ActualNonLaborUnits>0</ActualNonLaborUnits> 
       <ActualStartDate xsi:nil="true" /> 
       <ActualThisPeriodLaborCost>0</ActualThisPeriodLaborCost> 
       <ActualThisPeriodLaborUnits>0</ActualThisPeriodLaborUnits> 
       <ActualThisPeriodNonLaborCost>0</ActualThisPeriodNonLaborCost> 
       <ActualThisPeriodNonLaborUnits>0</ActualThisPeriodNonLaborUnits> 
       <AtCompletionDuration>1104</AtCompletionDuration> 
       <AtCompletionLaborCost>470304</AtCompletionLaborCost> 
       <AtCompletionLaborUnits>1104</AtCompletionLaborUnits> 
       <AtCompletionNonLaborCost>93840</AtCompletionNonLaborCost> 
       <AtCompletionNonLaborUnits>1104</AtCompletionNonLaborUnits> 
       <AutoComputeActuals>1</AutoComputeActuals> 
       <CalendarObjectId>597</CalendarObjectId> 
       <DurationPercentComplete>0</DurationPercentComplete> 
       <DurationType>1</DurationType> 
       <EstimatedWeight>1</EstimatedWeight> 
       <ExpectedFinishDate xsi:nil="true" /> 
       <ExternalEarlyStartDate xsi:nil="true" /> 
       <ExternalLateFinishDate xsi:nil="true" /> 
       <Feedback xsi:nil="true" /> 
       <FinishDate>2008-05-22T17:00:00</FinishDate> 
       <GUID>{841EDB12-3616-0043-BE5D-58C14151D45D}</GUID> 
       <Id>LH750</Id> 
       <IsNewFeedback>0</IsNewFeedback> 
       <LevelingPriority>2</LevelingPriority> 
       <Name>Elevator</Name> 
       <NonLaborUnitsPercentComplete>0</NonLaborUnitsPercentComplete> 
       <NotesToResources xsi:nil="true" /> 
       <ObjectId>43877</ObjectId> 
       <PercentComplete>0</PercentComplete> 
       <PercentCompleteType>1</PercentCompleteType> 
       <PlannedDuration>1104</PlannedDuration> 
       <PlannedFinishDate>2008-05-22T17:00:00</PlannedFinishDate> 
       <PlannedLaborCost>470304</PlannedLaborCost> 
       <PlannedLaborUnits>1104</PlannedLaborUnits> 
       <PlannedNonLaborCost>93840</PlannedNonLaborCost> 
       <PlannedNonLaborUnits>1104</PlannedNonLaborUnits> 
       <PlannedStartDate>2007-11-13T08:00:00</PlannedStartDate> 
       <PrimaryConstraintDate xsi:nil="true" /> 
       <PrimaryConstraintType xsi:nil="true" /> 
       <PrimaryResourceObjectId>1716</PrimaryResourceObjectId> 
       <ProjectObjectId>462</ProjectObjectId> 
       <RemainingDuration>1104</RemainingDuration> 
       <RemainingEarlyFinishDate>2008-05-22T17:00:00</RemainingEarlyFinishDate> 
       <RemainingEarlyStartDate>2007-11-13T08:00:00</RemainingEarlyStartDate> 
       <RemainingLaborCost>470304</RemainingLaborCost> 
       <RemainingLaborUnits>1104</RemainingLaborUnits> 
       <RemainingLateFinishDate>2008-06-19T17:00:00</RemainingLateFinishDate> 
       <RemainingLateStartDate>2008-02-29T08:00:00</RemainingLateStartDate> 
       <RemainingNonLaborCost>93840</RemainingNonLaborCost> 
       <RemainingNonLaborUnits>1104</RemainingNonLaborUnits> 
       <ResumeDate xsi:nil="true" /> 
       <SecondaryConstraintDate xsi:nil="true" /> 
       <SecondaryConstraintType xsi:nil="true" /> 
       <StartDate>2007-11-13T08:00:00</StartDate> 
       <Status>0</Status> 
       <SuspendDate xsi:nil="true" /> 
       <Type>2</Type> 
       <UnitsPercentComplete>0</UnitsPercentComplete> 
       <WBSObjectId>4364</WBSObjectId> 


       <....... /> 

      </Activity> 
+1

가 디버깅하기 위해, 체인 메소드 호출을 한 줄에 하나의 문장으로 분리 한 다음 스택 추적이 시작된 줄을 확인하십시오. 명령문 당 한 줄이면 디버거에서 단계별로 쉽게 수행 할 수 있습니다. 스택 추적을 게시 할 수 있습니까? 또한 XML의 단편이 도움이 될 것입니다. –

+1

XML의 일부가 네임 스페이스가 될 가능성이 있습니까? 이 경우 getElementsByTagNameNS를 사용해야합니다. –

+0

5 개의 분리 된 명령문으로 잘라내었을 때 Null Pointer Exception이 발생하는 것은'getNodeValue()'메소드 호출입니다. – Hassan

답변

1

난 당신이 사용하고 있지만중인 DOM 라이브러리 모르는 당신이과 같이 코드를 수정하면 어떻게됩니까 :

act.RemainingLateFinishDate = new DateTime(initElement.getElementsByTagName("RemainingLateFinishDate").getNodeValue()); 
+0

'getElementsByTagName()'이 NodeList를 반환하고'getNodeValue()'가 NodeList가 아닌 Node의 멤버이기 때문에 동작하지 않습니다. – Hassan

+0

사과드립니다. 나는 그 이름을 추측해야했다. 그래서 당신은 무엇이 null인지보기 위해 디버거를 단계별로 실행 해 보았습니까? 이전에 말한 것에서는 항목 (0)의 결과가 null 인 것처럼 들립니다. –

관련 문제