2012-01-17 2 views
6

Описание org.w3c.dom.Node.insertBefore в Android-SDK сказать следующее:org.w3c.dom.Node.insertПоэтому: NullPointerException, ошибка?

public abstract Node insertBefore (Node newChild, Node refChild)
Inserts the node newChild before the existing child node refChild. If refChild is null, insert newChild at the end of the list of children.

Но если я следующий я получаю NullPointerException, что происходит в реализации InsertBefore:

if(doc != null && doc.getFirstChild() != null && tmpNode != null) 
    doc.getFirstChild().insertBefore(tmpNode, null); 

WARN/System.err(11029): at org.apache.harmony.xml.dom.InnerNodeImpl.insertBefore(InnerNodeImpl.java:86)

Я попытался это с Android 2.2 и Android 2.3.3!
Для меня это кажется ошибкой. Может ли кто-нибудь подтвердить/воспроизвести это?


// редактировать (18.01.2012 13:05):
Я создал новый Java-проект, потому что я хотел, чтобы увидеть, если это работает в приложении Java:

public static void main(String[] args) { 
    DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder; 

     try { 
      docBuilder = dbfac.newDocumentBuilder(); 
      Document d = docBuilder.newDocument(); 

      if(d != null){ 
       d.appendChild(d.createElement("root")); 
       if(d.getFirstChild() != null){ 
        d.getFirstChild().insertBefore(d.createElement("foo"), null); 
        System.out.println(d.getFirstChild().getFirstChild().getNodeName()); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Этот код работает отлично.

Я также создал новый проект андроида, чтобы проверить это снова:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder; 

    try { 
     docBuilder = dbfac.newDocumentBuilder(); 
     Document d = docBuilder.newDocument(); 

     if(d != null){ 
      d.appendChild(d.createElement("root")); 
      if(d.getFirstChild() != null){ 
       d.getFirstChild().insertBefore(d.createElement("foo"), null); 
       System.out.println(d.getFirstChild().getFirstChild().getNodeName()); 
      } 
     } 
    } catch (Exception e2) { 
     e2.printStackTrace(); 
    } 
} 

Когда приложение достигает InsertBefore, исключение было показано выше брошено.

Так что тот же код работает в обычной Java, но не в Android. Для меня все еще кажется, что это ошибка в реализации согласования apache org.w3c.dom. Любые другие идеи?

+1

Держу пари, это ваш код, а не библиотека. Изучение того, что вы проблема, - это долгий трудный урок. – duffymo

+1

Конечно, может быть, это моя вина. Вот почему я сначала задаю этот вопрос (прежде чем я отправлю ошибку) и попрошу о помощи или кого-то воспроизвести это. Но это не первая проблема с реализацией apache-гармонии org.w3c.dom в android - есть и другие ошибки или пробелы в реализации, которые уже были подтверждены разработчиками и которые усложнили мою жизнь ^^. Так что, возможно, есть некоторые предрассудки ^^ – Marc

ответ

0

Добавить doc!=null в инструкции if. Кажется, что ваш объект doc имеет значение null.

+0

Я добавил doc! = Null, но я получаю то же исключение.Я совершенно уверен, что это ошибка, потому что весь код работает, если дать действующий Node в качестве второго параметра. Я добавлю этот doc! = Null check также в мой первоначальный пост, чтобы это стало понятным для других читателей. – Marc

3

Он может быть воспроизведен даже с 4.1.2 осуществления для InsertBefore из org.apache.harmony.xml.dom является

public Node insertBefore(Node newChild, Node refChild) throws DOMException { 
    LeafNodeImpl refChildImpl = (LeafNodeImpl) refChild; 

    if (refChildImpl.document != document) { 
     throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, null); 
    } 

    if (refChildImpl.parent != this) { 
     throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, null); 
    } 

    return insertChildAt(newChild, refChildImpl.index); 
} 

Как вы можете видеть не одну проверку, если refChildImpl является недействительным, так refChildImpl.document!=document бросает NullPointerException Эта реализация не имеет никакого смысла, если нижеследующего является правильным

описание org.w3c.dom.Node.insertBefore в Android-SDK говорит следующее:

общественного абстрактного узла InsertBefore (Node newChild, узел refChild)

Вставки узел newChild перед существующим refChild ребенка узла. Если refChild имеет значение null, вставьте новый элемент в конец списка.

Смежные вопросы