2011-09-06 79 views
2

我不知道可能是什么原因造成的。在下面附加的函数中,我有三个正确读取XML文件的字符串,三个标记为“问题”,所有这些都会导致空指针异常。它们的完成方式与前三种完全相同。有些事情我已经尝试包括改变呼叫:Java DOM解析器在某些字符串上返回空指针,但不是其他字符串

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

这不会导致空指针异常了,而是似乎返回一个空字符串,这是同样无用。我尝试的另一件事是将所有DOM的东西从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

当我将它分成五个单独的语句时,引起空指针异常的语句是'getNodeValue()'方法调用。 – Hassan

回答

1

我不知道你使用的DOM库,但如果你修改代码,像这样发生的:

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

这不起作用,因为'getElementsByTagName()'返回一个NodeList,'getNodeValue()'是Node的成员,而不是NodeList的成员。 – Hassan

+0

我的歉意。我应该猜到命名。所以你有没有试过在调试器中查看什么是空的?从你之前说的,听起来像项目(0)的结果是空的。 –