0

問題がどこにあるのかわかりません...助けてくれてありがとう!

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8192

com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:543)at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java: 1742)com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1619)at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java: 1657)com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1740)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDriver.next(XMLDocumentFragmentScannerImpl。 java:2930)com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl。scanDocument(XMLDocumentFragmentScannerImpl.java:510)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)atcom.sun.org.apache.xerces.internal.parsers.XML11Configuration。 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)のparse(XML11Configuration.java:737)com.sun.org.apache.xerces.internal.parsers.AbstractSAXParserのparse(AbstractSAXParser.java:1205)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl.java:522)at javax.xml.parsers.SAXParser.parse(SAXParser.java: 395)at javax.xml.parsers.SAXParser.parse(SAXParser.java:277)at myPackage.MainClass.main(MainClass.java:39)xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)atcom.sun.org.apache。 xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl.java:522)atjavax.xml.parsers。 SAXParser.parse(SAXParser.java:395)at javax.xml.parsers.SAXParser.parse(SAXParser.java:277)at myPackage.MainClass.main(MainClass.java:39)xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)atcom.sun.org.apache。 xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl.java:522)atjavax.xml.parsers。 SAXParser.parse(SAXParser.java:395)at javax.xml.parsers.SAXParser.parse(SAXParser.java:277)at myPackage.MainClass.main(MainClass.java:39)parse(SAXParserImpl.java:522)at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)at javax.xml.parsers.SAXParser.parse(SAXParser.java:277)at myPackage.MainClass.main(MainClass .java:39)parse(SAXParserImpl.java:522)at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)at javax.xml.parsers.SAXParser.parse(SAXParser.java:277)at myPackage.MainClass.main(MainClass .java:39)

メインクラスでは、フレームワークを次のようにコーディングします。

SAXParserFactory sf = SAXParserFactory.newInstance();   
SAXParser sax = sf.newSAXParser();   
sax.parse("english.xml", new DefaultElementHandler("page"){   
public void processElement(Element element) { 
// process the element
}
}); 

XMLファイルは巨大な4Gであり、テキストでいっぱいです。ファイルを解析してテキストを処理する必要があります。

現在、私はプロセス部分を何もしませんでした、ただコンソールでそれらを印刷したかっただけです。次にOOB..。

4

3 に答える 3

2

この投稿は10年前のものですが、このStack Overflowの投稿はGoogleで最高の結果であり、これに遭遇した他の人は、今日と同じように修正が必要になる可能性があるため、これに答えています。

はい、これはXercesのバグであり、2020年3月の時点ではまだ修正されていません。ただし、回避するのは比較的簡単です。

このバグはファイルサイズとは何の関係もありません。Xercesには、特定の4バイトUTF-8文字シーケンスに問題があります。何年にもわたって何度もパッチが適用されています。(https://bugs.openjdk.java.net/browse/JDK-8080085

プラットフォームによっては、Java環境でUTF-16のデフォルトのエンコーディングが想定される場合があります。XercesがUTF-16プラットフォームでこれらの4バイトシーケンスの1つにヒットすると、表示される例外トレースが表示されます。

幸い、これは簡単に修正できます。バグレポートが示唆する簡単な修正の1つは、入力ファイル内のすべての4バイトUTF-8文字を数字エンティティに変換することです。もう1つの「より正確な」方法は、エンコーディングを明示的に指定することです... XMLスキーマですでに指定されている場合でも、入力ストリームの一部として指定します。

たとえば、SAXを介してXercesにアクセスしている場合は、ほとんどのチュートリアルで示されている方法で呼び出さないでください。SAXParser.parse(filename, handler)代わりに、次のように独自のInputStreamを作成する必要があります。

final SAXParser saxParser = factory.newSAXParser();
File file = new File(filename);
InputStream inputStream = new FileInputStream(file);
Reader reader = new InputStreamReader(inputStream,"UTF-8");                      
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");                      
saxParser.parse(is, handler);

これが誰かに役立つことを願っています!

于 2020-03-29T02:13:53.413 に答える
0

そのスタックトレースに付随するエラーメッセージを印刷してみてください。これを行うには、例外System.err.println(e.getMessage())である場所への呼び出しを追加します。eメッセージには、アクセスしようとしたインデックスが表示されます。

インデックスが負の場合、整数のオーバーフローが発生している可能性があります。 その場合は、Xercesにバグレポートを提出する必要があります。Xercesがそれほど大きなファイルを処理するように設計されていない可能性があります。

于 2009-12-17T06:28:53.537 に答える
0

私は同じ問題を抱えていて、エンコーディングを指定しても役に立ちませんでした。代わりにWoodstoxを使用しました。移行はとても簡単でした。コードを1行変更するだけで済みました。

import com.ctc.wstx.stax.WstxInputFactory;

WstxInputFactory xmlInputFactory = WstxInputFactory.newInstance();
于 2021-08-08T23:34:18.557 に答える