无法在Java中查明“空指针异常”的原因

时间:2011-08-04 21:41:13

标签: java xml data-structures

好的,过去一周左右我一直试图解决这个问题,我通常不喜欢在这里问这类问题,但我现在还没有选择。

我是Java的新手,我确信这是首先出现这种情况的原因。

嗯,我在这里要做的是读取带有“WBS”(工作分解结构)节点和“活动”节点的XML文件,并将它们放在此数据结构中供以后使用。我有一个名为WBS的类,它基本上由子WBS个对象的ArrayList和另一个Activity个对象的ArrayList(另一个小类)组成。现在问题是:我可以从XML文件中获取所有“WBS”节点,我可以获得“活动”节点,但是当我尝试按顺序获取两个时,我得到了前面提到的“空指针异常”。我发布了所有的代码,因为它存在于许多不同的文件中,坦率地说并不是真的相关。但是,如果您认为它会有所帮助,我可以在其中进行编辑。

如果Problem行中的任何一行被删除,一切正常(减去所取出的行的功能)

这是有问题的代码:

   private WBS getWBSStructure(Element initElement){
      WBS structure = new WBS();
      structure.setName(initElement.getElementsByTagName("Name").
            item(0).getChildNodes().item(0).getNodeValue());
      //WBSElement = initElement;
      structure.Children = new ArrayList<WBS>();
      NodeList initAllChildren = initElement.getChildNodes();
      for(int n=0;n<initAllChildren.getLength();n++){
         Node Child = initAllChildren.item(n);
         String childName = Child.getNodeName();
         if(childName=="WBS") {
           structure.Children.add(getWBSStructure((Element)Child));//<--Problem 1
           continue;
         }
         if(childName=="Activity") {
           structure.Activities.add(getActivity((Element)Child));//<--Problem 2
           continue;
         }
      }
      return structure;
   }

   private Activity getActivity(Element initElement){
      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());
      return act;
   }

评论请求堆栈跟踪。这是否足够?

显示java.lang.NullPointerException     at analyzer_main.PriXMLReader.getWBSStructure(PriXMLReader.java:84)     at analyzer_main.PriXMLReader.getWBSStructure(PriXMLReader.java:83)     at analyzer_main.PriXMLReader.getWBSStructure(PriXMLReader.java:60)     at analyzer_main.main_window $ 1.shellActivated(main_window.java:77)     在org.eclipse.swt.widgets.TypedListener.handleEvent(未知来源)     在org.eclipse.swt.widgets.EventTable.sendEvent(未知来源)     在org.eclipse.swt.widgets.Widget.sendEvent(未知来源)     在org.eclipse.swt.widgets.Widget.sendEvent(未知来源)     在org.eclipse.swt.widgets.Widget.sendEvent(未知来源)     at org.eclipse.swt.widgets.Decorations.WM_ACTIVATE(Unknown Source)     在org.eclipse.swt.widgets.Shell.WM_ACTIVATE(未知来源)     在org.eclipse.swt.widgets.Control.windowProc(未知来源)     在org.eclipse.swt.widgets.Canvas.windowProc(未知来源)     在org.eclipse.swt.widgets.Decorations.windowProc(未知来源)     在org.eclipse.swt.widgets.Shell.windowProc(未知来源)     在org.eclipse.swt.widgets.Display.windowProc(未知来源)     at org.eclipse.swt.internal.win32.OS.BringWindowToTop(Native Method)     在org.eclipse.swt.widgets.Decorations.bringToTop(未知来源)     在org.eclipse.swt.widgets.Shell.open(未知来源)     at analyzer_main.main_window.open(main_window.java:60)     在analyzer_main.main_window.main(main_window.java:45)

1 个答案:

答案 0 :(得分:4)

每次运行此代码时,此行应该给出Null指针异常。无论你之前是否编辑了一行。

if (childName=="Activity") {
    structure.Activities.add(getActivity((Element)Child));
    continue;

您根本没有初始化structure.Activities。应该有类似的东西:

structure.Activities = new ArrayList<Activity>();