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?
Scommetto che è il tuo codice, non la biblioteca. Imparare che tu sei il problema è una lunga, dura lezione. – duffymo
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