2013-04-08 92 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

相关问题