Org.w3c.dom.Node.insertBefore: NullPointerException, ошибка?

Описание org.w3c.dom.Node.insert Перед Android-SDK скажу следующее:

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!
Для меня это кажется ошибкой. Может ли кто-нибудь подтвердить / воспроизвести это?

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

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

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

 @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. Любые другие идеи?

Его можно воспроизвести даже с помощью 4.1.2. Реализация для insertBefore из org.apache.harmony.xml.dom is

 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 null, поэтому refChildImpl.document!=document throws NullPointerException Эта реализация не имеет никакого смысла, если следующее верно

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

Public abstract Node insertBefore (Node newChild, Node refChild)

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

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