Jsoup解析抛出ArrayIndexOutOfBoundsException

时间:2013-04-26 19:53:48

标签: html jsoup

我想解析一个html字符串。它抛出异常如下。 内容长度大于65536,那问题呢?谢谢!

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)

1 个答案:

答案 0 :(得分: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;
}

(我在第92行输入了引发异常的内容)

现在,Java中的int的范围 -2.147.483.648 2.147.483.647 。 65536仅在您使用unsigned short时不相关(在java中不可用)。

请检查......

  • 如果您的输入有效html
  • 如果使用较短的长度html抛出此异常
  • 如果您的代码可以影响解析
  • 如果你的html中有任何非unicode字符 - 与int相反 - char类型只有16位(这意味着:上限是65535!)

您还可以在调试中运行程序,检查引发exeption后的变量。特别是seq.charAt(j)input[i]的值可能很有趣。