Не могу точно определить причину «исключения нулевого указателя» в Java - PullRequest
1 голос
/ 05 августа 2011

Хорошо, я пытался исправить это в течение прошлой недели или около того, и я обычно не люблю задавать этот тип вопросов здесь, но у меня действительно нет выбора на данный момент.

Я очень новичок в Java, и я уверен, что причина этого в первую очередь.

Что я пытаюсь сделать, это прочитать файл XML с узлами "WBS" (структура разбивки работ) и узлами "Activity" и поместить их в эту структуру данных для дальнейшего использования. У меня есть класс с именем WBS, который по существу состоит из ArrayList дочерних WBS объектов и другого ArrayList из Activity объектов (еще один маленький класс). Теперь вот проблема: я могу получить все узлы "WBS" из XML-файла, я могу получить узлы "Activity", но когда я пытаюсь получить оба по порядку, я получаю вышеупомянутое " Исключение нулевого указателя". Я публикую весь код, так как он находится в нескольких разных файлах, и, откровенно говоря, не очень актуален. Однако, если вы считаете, что это поможет, я могу отредактировать его.

Если какая-либо из 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.shellActivation (main_window.java:77) at org.eclipse.swt.widgets.TypedListener.handleEvent (Неизвестный источник) в org.eclipse.swt.widgets.EventTable.sendEvent (неизвестный источник) at org.eclipse.swt.widgets.Widget.sendEvent (Неизвестный источник) at org.eclipse.swt.widgets.Widget.sendEvent (Неизвестный источник) at org.eclipse.swt.widgets.Widget.sendEvent (Неизвестный источник) at org.eclipse.swt.widgets.Decorations.WM_ACTIVATE (неизвестный источник) на org.eclipse.swt.widgets.Shell.WM_ACTIVATE (неизвестный источник) at org.eclipse.swt.widgets.Control.windowProc (Неизвестный источник) в org.eclipse.swt.widgets.Canvas.windowProc (неизвестный источник) at org.eclipse.swt.widgets.Decorations.windowProc (Неизвестный источник) в org.eclipse.swt.widgets.Shell.windowProc (неизвестный источник) at org.eclipse.swt.widgets.Display.windowProc (неизвестный источник) в org.eclipse.swt.internal.win32.OS.BringWindowToTop (собственный метод) at org.eclipse.swt.widgets.Decorations.bringToTop (Неизвестный источник) на org.eclipse.swt.widgets.Shell.open (неизвестный источник) at analyzer_main.main_window.open (main_window.java:60) at analyzer_main.main_window.main (main_window.java:45)

1 Ответ

4 голосов
/ 05 августа 2011

Эта строка должна давать исключение нулевого указателя при каждом запуске этого кода.Независимо от того, редактировали ли вы строку раньше или нет.

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

Вы вообще не инициализировали structure.Activities.Там должно было быть что-то вроде:

structure.Activities = new ArrayList<Activity>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...