2013-04-26 83 views
0

我想解析一个html字符串。它如下引发异常。 内容长度大于65536,这是什么问题?谢谢!Jsoup parse throws ArrayIndexOutOfBoundsException

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 66467 
    at org.jsoup.parser.CharacterReader.nextIndexOf(CharacterReader.java:92) 
    at org.jsoup.parser.CharacterReader.containsIgnoreCase(CharacterReader.java:277) 
    at org.jsoup.parser.TokeniserState$11.read(TokeniserState.java:219) 
    at org.jsoup.parser.Tokeniser.read(Tokeniser.java:42) 
    at org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:47) 
    at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:41) 
    at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:37) 
    at org.jsoup.parser.Parser.parse(Parser.java:90) 
    at org.jsoup.Jsoup.parse(Jsoup.java:58) 
    at myproject.MyIndexer.getTitle(MyIndexer.java:137) 
    at myproject.MyIndexer.indexDocs(MyIndexer.java:115) 
    at myproject.MyIndexer.main(MyIndexer.java:80) 

回答

0

这应该不是原因。 nextIndexOf()仅使用整数:

int nextIndexOf(CharSequence seq) { 
    // doesn't handle scanning for surrogates 
    char startChar = seq.charAt(0); 
    for (int offset = pos; offset < length; offset++) { 
     // scan to first instance of startchar: 
     if (startChar != input[offset]) 
      while(++offset < length && startChar != input[offset]); 
     if (offset < length) { 
      int i = offset + 1; 
      int last = i + seq.length()-1; 
      for (int j = 1; i < last && seq.charAt(j) == input[i]; i++, j++);  /* Line 92 */ 
      if (i == last) // found full sequence 
       return offset - pos; 
     } 
    } 
    return -1; 
} 

(我makred其中异常被抛出92行)现在

int在Java有一个范围-2.147.483.6482.147.483.647。 65536仅与您使用unsigned short(在Java中不可用)相关。

请检查...

  • 如果您的输入有效的HTML
  • 如果此异常甚至长度较短HTML抛出
  • 如果你的代码可以影响解析
  • ,如果您有您的html中的任何非Unicode字符 - 与int - char类型相反,只有16位(即上限为65535!)

你也可以在调试中运行你的程序,并在引发exeption后检查变量。尤其值得注意的是seq.charAt(j)input[i]

+0

你是对的!这不是html内容长度的原因。在我发送解析消息之前,我试图删除一些响应头。我似乎介绍了一些Jsoup无法解析的东西。你碰巧知道Jsoup如何直观地删除响应头?我的意思是头部“HTTP/1.1 200”OK“ContentLength:16254” – 2013-04-27 00:03:31

+0

如果连接到网站更好使用'connect()',而不是'parse()'方法。你可以通过选择它并调用'remove()'来删除任何类型的元素。 – ollo 2013-04-27 19:05:23

相关问题