2013-04-26 106 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