56

「ファイルの終わりが早すぎる」という非常に奇妙なメッセージが表示されます。私たちのサーバーの1つで、過去数日間の例外。同じ構成 XML が別のサーバーで正常に機能します。これらの両方のサーバーで Tomcat 5.0.28 を使用しています。このコードは何年もの間 (7 年以上) 機能してきましたが、最近サーバーがクラッシュした後、サーバーの 1 つでこの問題に直面しました。XML と Java 解析コードに変更はありません。:(

私が見ることができる唯一の違いは、Javaバージョンです-

問題 サーバー Java バージョン「1.6.0_16」 Java(TM) SE ランタイム環境 (ビルド 1.6.0_16-b01) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 14.2-b01、混合モード)

Working Server Java バージョン "1.6.0_07" Java(TM) SE ランタイム環境 (ビルド 1.6.0_07-b06) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 10.0-b23、混合モード)

これは、数年間動作しているJavaコードです-

private void readSource(final InputSource in ) {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(in);
        Element elt = doc.getDocumentElement();

        this.readElement( elt );
    } catch ( Exception ex ) {
        ex.printStackTrace();
        throw new ConfigurationException( "Unable to parse configuration information", ex );
    }
}

そして、ここに例外があります。

[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at com.circus.core.Configuration.readSource(Configuration.java:706)

既に XML の検証を試みましたが、エラーは見つかりませんでした。考えられる問題を他にどこで探すことができますか?

どんなポインタでも大歓迎です!

TIA - マニッシュ

4

8 に答える 8

70

Java InputStream の問題です。ファイル オフセット位置カウンタがファイルの最後に移動されると、ストリームが読み取られます。同じストリームを使用した後続の読み取りでは、このエラーが発生します。そのため、ストリームを閉じて再度開くか、呼び出しinputStream.reset()てオフセット カウンターを初期位置にリセットする必要があります。

于 2012-12-06T21:29:18.633 に答える
28

これは解決されました。問題は別のところにありました。cron ジョブの別のコードは、XML を長さ 0 のファイルに切り詰めていました。私はその世話をしました。

于 2013-02-11T10:17:31.800 に答える
22

この例外は、空の文字列/空のバイト配列を解析している場合にのみ発生します。

以下は、それを再現する方法のスニペットです。

String xml = ""; // <-- deliberately an empty string.
ByteArrayInputStream xmlStream = new java.io.ByteArrayInputStream(xml.getBytes());
Unmarshaller u = JAXBContext.newInstance(...)
u.setSchema(...);
u.unmarshal( xmlStream ); // <-- here it will fail
于 2016-10-14T09:35:49.583 に答える
3

入力ストリームが適切に閉じられていない場合、この例外が発生する可能性があります。確認してください:使用される入力ストリームが何らかの方法で「前」に使用されていない場合、どこで読むつもりですか。つまり、1 回の操作で同じ入力ストリームから 2 回目に読み取ると、2 回目の呼び出しでこの例外が発生します。また、finally ブロックなどで入力ストリームを閉じるようにしてください。

于 2015-08-11T22:30:13.763 に答える
2

XML ファイルの文字エンコードが正しいことを確認しますか? FileReader常にプラットフォームのデフォルトのエンコーディングを使用するため、「動作している」サーバーのデフォルトのエンコーディングが (たとえば) ISO-8859-1 で、「問題のある」サーバーが UTF-8 を使用している場合、XML に非 ASCII が含まれていると、このエラーが表示されます。文字。

FileReader の代わりに FileInputStream から InputSource を作成すると機能しますか?

于 2012-11-20T20:54:43.020 に答える
1

私たちの場合、それは空のAndroidManifest.xmlでした。

Eclispe のアップグレード中に、いつものトラブルに遭遇しました。AndroidManifest.xml は、上書きされた後、ビルド スクリプトによって SVN にチェックインされたに違いありません。

コマンドラインからではなく、Eclipse内からコンパイルして見つけました。

于 2014-10-26T12:51:32.353 に答える