【问题标题】:Can't pinpoint the cause of a 'Null Pointer Exception' in Java无法查明 Java 中“空指针异常”的原因
【发布时间】:2011-08-04 21:41:12
【问题描述】:

好的,过去一周左右我一直在尝试解决这个问题,我通常不喜欢在这里问这种类型的问题,但我现在真的别无选择。

我对 Java 很陌生,我敢肯定这首先是原因。

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

如果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 在analyzer_main.PriXMLReader.getWBSStructure(PriXMLReader.java:84) 在analyzer_main.PriXMLReader.getWBSStructure(PriXMLReader.java:83) 在analyzer_main.PriXMLReader.getWBSStructure(PriXMLReader.java:60) 在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(未知来源) 在 org.eclipse.swt.widgets.Decorations.WM_ACTIVATE(未知来源) 在 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(未知来源) 在 org.eclipse.swt.internal.win32.OS.BringWindowToTop(本机方法) 在 org.eclipse.swt.widgets.Decorations.bringToTop(未知来源) 在 org.eclipse.swt.widgets.Shell.open(未知来源) 在analyzer_main.main_window.open(main_window.java:60) 在analyzer_main.main_window.main(main_window.java:45)

【问题讨论】:

  • 你试过用调试器单步调试代码吗?
  • 是的。也许因为我缺乏任何 Java 知识,这不起作用,但我会继续尝试,
  • @Matt Ball:我实际上不知道该怎么做。这很糟糕吗?
  • PriXMLReader.java 的第 84 行是什么?
  • 不要将字符串与 == 进行比较,而是使用等号。例如,不要这样做:if(childName=="Activity"){,而是这样做:if(childName.equals("Activity")) {。另外,为什么不在您的问题 2 行执行 println 以查看哪个对象为空。此外,您确实应该格式化该代码以使其可读,特别是如果您希望无偿志愿者(我们!)帮助您。对不起,这太糟糕了。

标签: java xml data-structures


【解决方案1】:

每次运行此代码时,此行都应给出 Null 指针异常。不管你之前是否编辑过一行。

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

你根本没有初始化structure.Activities。应该是这样的:

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

【讨论】:

  • 是的,这就像一个魅力!非常感谢你!我得等一下,但我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多