0

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

1 回答 1

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 行抛出异常)

现在,int在 Java 中有一个范围–2.147.483.6482.147.483.647。65536 仅在您使用时才相关unsigned short(在 java 中不可用)。

请检查 ...

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

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

于 2013-04-26T21:47:47.143 回答