2012-01-17 11 views
6

La descripción de org.w3c.dom.Node.insertBefore del Android SDK dicen lo siguiente:org.w3c.dom.Node.insertBefore: NullPointerException, ¿Error?

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.

pero si lo hago la siguiente llego NullPointerException que ocurre en la implementación 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)

he intentado esto con Android 2.2 y Android 2.3.3!
Para mí, parece ser un error. ¿Alguien puede confirmar/reproducir eso?


// edición (18.01.2012 13:05):
he creado un nuevo proyecto Java, porque quería ver si esto funciona en una aplicación 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(); 
     } 
    } 

Este código funciona perfectamente.

También he creado un nuevo proyecto androide para probar esto otra vez:

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

Cuando la solicitud llega al insertBefore, la excepción se muestra más arriba es lanzado.

Así que el mismo código funciona en Java normal, pero no en Android. Para mí todavía parece que es un error en la implementación de armonía apache de org.w3c.dom. ¿Alguna otra idea?

+1

Apuesto a que es su código, no la biblioteca. Aprender que usted es el problema es una lección larga y difícil. – duffymo

+1

Por supuesto, podría ser que sea mi culpa. Por eso hago aquí la pregunta (antes de enviar un error) y solicito ayuda o alguien para reproducir eso. Pero ese no es el primer problema que tengo con la implementación apache-harmony de org.w3c.dom en Android, también hay otros errores o lagunas en la implementación que ya han sido confirmados por los desarrolladores y que hicieron mi vida más difícil ^^. Así que tal vez tenga algunos prejuicios ^^ – Marc

Respuesta

0

Agregue doc!=null en la instrucción if. Parece que tu objeto doc es nulo.

+0

Agregué doc! = Null, pero obtengo la misma excepción.Estoy bastante seguro de que es un error, porque todo el código funciona si se da un nodo válido como segundo parámetro. Añadiré este doc! = Null check también en mi publicación original para que quede claro para otros lectores. – Marc

3

Puede ser reproducida incluso con 4.1.2 Implementación de insertBefore de org.apache.harmony.xml.dom es

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

Como se puede ver ninguna comprobación de si uno refChildImpl es nulo por lo refChildImpl.document!=document tiros NullPointerException Esta implementación no tiene ningún sentido si sigue es correcta

la descripción de org.w3c.dom.Node.insertBefore del Android SDK-dice lo siguiente:

pública abstracta Nodo insertBefore (Nodo newChild, Nodo refChild)

Inserta el newChild nodo antes del nodo hijo refChild existente. Si refChild es nulo, inserte newChild al final de la lista de elementos secundarios.

Cuestiones relacionadas