【问题标题】:Jsoup parse throws ArrayIndexOutOfBoundsExceptionJsoup 解析抛出 ArrayIndexOutOfBoundsException
【发布时间】:2013-04-27 05:54:32
【问题描述】:

我想解析一个 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)

【问题讨论】:

    标签: html jsoup


    【解决方案1】:

    这不应该是原因。 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.6482.147.483.647 的范围。 65536 仅在您使用 unsigned short 时才相关(在 java 中不可用)。

    请检查...

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

    您还可以在调试中运行您的程序,并在抛出异常后检查变量。尤其是seq.charAt(j)input[i] 的值可能会很有趣。

    【讨论】:

    • 你是对的!这不是 html 内容长度的原因。在发送解析之前,我尝试删除一些响应标头。看来我介绍了一些 Jsoup 无法解析的东西。你碰巧知道 Jsoup 是如何直观地移除响应头的吗?我的意思是标题“HTTP/1.1 200”OK 到“ContentLength:16254”
    • 如果您连接到一个网站,最好使用connect(),而不是parse() 方法。您可以通过选择任何类型的元素并调用 remove() 来删除它。
    猜你喜欢
    • 2016-11-09
    • 2023-03-16
    • 1970-01-01
    • 2012-04-12
    • 2013-05-10
    • 1970-01-01
    • 2020-02-07
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多