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