我不知道可能是什么原因造成的。在下面附加的函数中,我有三个正确读取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>
帮助调试,尝试将你的链接方法调用分成每行一条语句,然后看看堆栈跟踪从哪一行开始。如果每条语句只有一行,您也可以更轻松地在调试器中执行操作。你可以发布堆栈跟踪吗?此外,只是XML的一个片段将有所帮助。 –
您的某些XML是否有命名空间?在这种情况下,您需要使用getElementsByTagNameNS。 –
当我将它分成五个单独的语句时,引起空指针异常的语句是'getNodeValue()'方法调用。 – Hassan