2012-01-17 59 views
6

的Android的SDK的org.w3c.dom.Node.insertBefore的描述說以下內容: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.

但是,如果我這樣做,我得到的是發生在執行的insertBefore NullPointerException異常:

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!
對我來說,它似乎是一個錯誤。任何人都可以確認/重現嗎?


//編輯(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中。對我來說,它似乎仍然是org.w3c.dom的apache協調實現中的一個錯誤。任何其他想法?

+1

我敢打賭這是你的代碼,而不是圖書館。瞭解到你是這個問題是一個漫長而艱難的教訓。 – duffymo 2012-01-17 10:26:14

+1

當然,這可能是我的錯。那爲什麼我先在這裏提出這個問題(在我提交錯誤之前)並尋求幫助或某人重現此問題。但那不是我在android中使用org.w3c.dom的apache-harmony實現時遇到的第一個問題 - 在實現中還存在其他錯誤或缺陷,這些問題已經得到開發人員的確認,並使我的生活更加艱難。所以也許有一些偏見^^ – Marc 2012-01-17 10:34:23

回答

0

在if語句中添加doc!=null。看來你的doc對象是null。

+0

我加了doc!= null,但是我得到了同樣的異常。我很確定它是一個錯誤,因爲如果給出一個有效的節點作爲第二個參數,整個代碼就可以工作。我會在我的原始文章中添加這個doc!= null檢查,以便其他讀者清楚。 – Marc 2012-01-17 10:23:30

3

可以從org.apache.harmony.xml.dom被複制,即使4.1.2 執行情況的insertBefore是

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是空,因此refChildImpl.document!=document拋出NullPointerException 此實現不作任何意義,如果下面是正確

的Android的SDK的org.w3c.dom.Node.insertBefore描述說以下內容:

public abstract Node insertBefore(Node newChild,Node refChild)

在現有子節點refChild之前插入節點newChild。如果 refChild爲空,則在子列表的末尾插入newChild。