2012-01-17 34 views
6

Các mô tả về org.w3c.dom.Node.insertBefore của Android SDK nói như sau: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.

Nhưng nếu tôi làm như sau tôi nhận được NullPointerException xảy ra trong việc thực hiệ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)

tôi cố gắng này với Android 2.2 và Android 2.3.3!
Đối với tôi, nó có vẻ là một lỗi. Ai có thể xác nhận/tái tạo điều đó?


// chỉnh sửa (2012/01/18 13:05):
Tôi tạo ra một java-dự án mới, vì tôi muốn để xem nếu điều này làm việc trong một ứng dụng 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(); 
     } 
    } 

Mã này hoạt động hoàn hảo.

Tôi cũng tạo ra một dự án Android mới để kiểm tra này một lần nữa:

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

Khi ứng dụng đạt đến insertBefore, các ngoại lệ hiển thị ở trên được ném.

Vì vậy, cùng một mã hoạt động trong Java bình thường, nhưng không phải trong Android. Đối với tôi nó vẫn có vẻ như là một lỗi trong việc thực hiện hài hòa apache của org.w3c.dom. Bất kỳ ý tưởng nào khác?

+1

Tôi sẽ đặt cược đó là mã của bạn chứ không phải thư viện. Học rằng bạn là vấn đề là một bài học dài và khó. – duffymo

+1

Tất nhiên có thể đó là lỗi của tôi. Đó là lý do tại sao tôi đặt câu hỏi ở đây trước tiên (trước khi tôi gửi một lỗi) và yêu cầu giúp đỡ hoặc một người nào đó để tái tạo điều đó. Nhưng đó không phải là vấn đề đầu tiên tôi có với việc thực hiện apache-harmony của org.w3c.dom trong android - có nhiều lỗi hoặc khoảng trống khác trong việc triển khai cũng như đã được các nhà phát triển xác nhận và làm cho cuộc sống của tôi trở nên khó khăn hơn ^^. Vì vậy, có thể có một số thành kiến ​​^^ – Marc

Trả lời

0

Thêm doc!=null vào câu lệnh if. Có vẻ như đối tượng doc của bạn là null.

+0

Tôi đã thêm doc! = Null, nhưng tôi cũng có ngoại lệ tương tự.Tôi khá chắc chắn rằng đó là một lỗi, bởi vì toàn bộ mã hoạt động nếu đưa ra một Node hợp lệ làm tham số thứ hai. Tôi sẽ thêm tài liệu này! = Null cũng kiểm tra trong bài viết gốc của tôi để nó rõ ràng cho người đọc khác. – Marc

3

Nó có thể được sao chép ngay cả với 4.1.2 thực hiện cho insertBefore từ org.apache.harmony.xml.dom là

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

Như bạn có thể thấy không có ai kiểm tra nếu refChildImpl là null nên refChildImpl.document!=document ném NullPointerException thực hiện này không có ý nghĩa gì nếu sau là đúng

các mô tả về org.w3c.dom.Node.insertBefore của Android SDK cho biết như sau:

Node chèn trước công khaiTrước (Nút mớiChọn lại, Node refChild)

Chèn nút mớiChọn trước nút con hiện tại refChild. Nếu refChild là null, hãy chèn newChild vào cuối danh sách trẻ em.