2013-04-08 56 views
1

正如在很多論壇上所說的那樣,元素是DOM中節點的特例。爲什麼給代碼拋出異常(Jsoup)

但是我得到了違反這個規則的異常。

它在語句elem.remove()處引發異常。

這裏,ele是一個元素。 remove()是Jsoup API中的一個函數,它從DOM中刪除節點及其後代。

例外: -

[WARNING] 
java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.IllegalArgumentException: Object must not be null 
    at org.jsoup.helper.Validate.notNull(Validate.java:16) 
    at org.jsoup.nodes.Node.remove(Node.java:266) 
    at XXX.YYY.ZZZ.Template_Matching.Template_Matching.removeProductLister(Template_Matching.java:80) 
    at XXX.YYY.ZZZ.Template_Matching.Template_Matching.main(Template_Matching.java:376) 
    ... 6 more 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 

代碼: -

public static void function(Document doc1, Document doc2, String tag) { 

     //Checking for ULs 
     Elements uls_1 = doc1.getElementsByTag(tag); 
     Elements uls_2 = doc2.getElementsByTag(tag); 

     for (Element elem1 : uls_1) { 

      // Check if elem1 exists in DOM, If No, then continue 

      for (Element elem2 : uls_2) { 

       // Check if elem2 exists in DOM, If No, then continue 

       // If id matches, remove them 
       if ((!"".equals(elem1.id())) && (elem1.id().equals(elem2.id()))) { 
        elem1.remove(); 
        elem2.remove(); 
        break; 
       } 
      } 
     } 
    } 
+0

你應該確保DOC1和DOC2是不同的文件。 – Alohci 2013-04-08 13:16:57

+0

是的,兩者是不同的。 – devsda 2013-04-08 13:18:24

+0

@Alohci我可以就此進行討論。我將在聊天時解釋我的代碼? – devsda 2013-04-08 13:23:02

回答

2

造成的:java.lang.IllegalArgumentException異常:對象不能爲null

您需要檢查您沒有訪問空對象的屬性...

+0

但是這個問題並沒有出現regulary。有時它會出現,有時它運行良好。 – devsda 2013-04-08 12:49:45

+0

當然,elem1和elem2不能爲null .id()存取器不能拋出if(...)? – Adrian 2013-04-08 12:53:46

+0

@Adrian是的,我在我評論的地方檢查了這個\「檢查DOM是否存在elem1,如果否,則繼續',如果該元素不在DOM中,則繼續,否則繼續。 – devsda 2013-04-08 13:04:49

2

當您嘗試刪除其父項已被刪除的元素時,會發生錯誤。這可能會指向Jsoup中的一個錯誤。不刪除父母也刪除孩子?

一種解決方法是首先檢查是否存在父:

if (element != null && element.parent() != null) { // fixes java.lang.IllegalArgumentException in org.jsoup.helper.Validate.notNull 
    element.remove(); 
} 
+0

如果您正在迭代元素並刪除它的子元素之前的父元素,可能會發生這種情況,因此可能jsoup的行爲是正確的,但是錯誤正在修改循環中的元素 – valepu 2017-08-30 13:08:33

相關問題