我不知道可能是什麼原因造成的。在下面附加的函數中,我有三個正確讀取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