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?
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
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