2012-01-17 18 views
6

La descrizione org.w3c.dom.Node.insertBefore del Android SDK dire quanto segue:org.w3c.dom.Node.insertBefore: NullPointerException, Bug?

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.

Ma se faccio il seguente ottengo NullPointerException che si verifica nella realizzazione 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)

ho provato questo con Android 2.2 e Android 2.3.3!
Per me sembra un bug. Qualcuno può confermarlo/riprodurlo?


// modifica (18.01.2012 13:05):
Ho creato un nuovo java-progetto, perché volevo vedere se questo funziona in un'applicazione 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(); 
     } 
    } 

Questo codice funziona perfettamente

Ho anche creato un nuovo progetto Android per testare questo nuovo:

@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(); 
    } 
} 

Quando l'applicazione raggiunge l'insertBefore, l'eccezione sopra indicato viene generata.

Quindi lo stesso codice funziona in Java normale, ma non in Android. Per me sembra ancora che si tratti di un bug nell'implementazione dell'armonia apache di org.w3c.dom. Altre idee?

+1

Scommetto che è il tuo codice, non la biblioteca. Imparare che tu sei il problema è una lunga, dura lezione. – duffymo

+1

Ovviamente potrebbe essere colpa mia. Ecco perché chiedo prima la domanda (prima di inviare un bug) e chiedo aiuto o qualcuno per riprodurlo. Ma questo non è il primo problema che ho con l'implementazione apache-harmony di org.w3c.dom in Android - ci sono altri bug o lacune nell'implementazione che sono già stati confermati dagli sviluppatori e che mi hanno reso la vita più dura ^^. Quindi forse ho dei pregiudizi ^^ – Marc

risposta

0

Aggiungi doc!=null nella dichiarazione if. Sembra che il tuo oggetto doc sia nullo.

+0

Ho aggiunto doc! = Null, ma ottengo la stessa eccezione.Sono abbastanza sicuro che si tratti di un bug, perché l'intero codice funziona se si dà un nodo valido come secondo parametro. Aggiungerò questo documento! = Controllo nullo anche nel mio post originale in modo che sia chiaro per gli altri lettori. – Marc

3

Può essere riprodotto anche con 4.1.2 Attuazione per insertBefore da 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); 
} 

Come si può vedere nessuno controlla se refChildImpl è null in modo refChildImpl.document!=document tiri NullPointerException Questa implementazione non ha alcun senso se segue è corretto

la descrizione org.w3c.dom.Node.insertBefore del Android SDK dice quanto segue:

public abstract Nodo insertBefore (Node newChild, Nodo refChild)

Inserisce il newChild nodo prima di quella esistente refChild nodo figlio. Se refChild è nullo, inserire newChild alla fine dell'elenco di elementi secondari.

Problemi correlati