2011-09-06 23 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)的結果是空的。 –