0

この質問は頻繁に聞かれますが、私の状況は異なります。チャネルの単純なシーク操作で例外が発生しました。これが私のコードです。

 private RandomAccessFile channel;
   .....
 try {
        channel.seek(pos);
    } catch (IOException ioe) {
        System.err.printf("Seek file size %d  seek to %d%n", originalSize, pos);
        throw ioe;
    }

例外が発生した値をキャッチするためだけに try を追加しました。そのため、ログに次のようなものが表示されます。

08-25 22:50:11.662: W/System.err(18839): Seek file size 2198818800  seek to 2196985856
08-25 22:50:11.682: E/wavpack(18839): Value too large for defined data type
08-25 22:50:11.682: E/wavpack(18839): java.io.IOException: Value too large for defined data type
08-25 22:50:11.682: E/wavpack(18839):   at org.apache.harmony.luni.platform.OSFileSystem.seek(Native Method)
08-25 22:50:11.682: E/wavpack(18839):   at dalvik.system.BlockGuard$WrappedFileSystem.seek(BlockGuard.java:210)

実際に何が例外を引き起こしたのかを把握するのに便利なAndroidソースがありません。Windows または Linux で同じソース データを使用して Oracle Java を使用すると、コードは正常に動作します。どんな手掛かり?

4

1 に答える 1

1

これは、こちらで詳しく説明されているように、ハニカム以前の既知のバグでした。

あなたのコメントから、古い OS でテストしていることがわかります。それがおそらくエラーが表示される理由です。新しい OS でテストできる場合は、これを確認できるはずです。

このエラーの解決に関しては、読み取られるファイルを制御できる場合は、2GB 未満のファイルのみを処理してみてください。それ以外の場合は、ファイルを解析する他の方法を検討するか、独自のファイル I/O クラスを作成する必要があります。

古いデバイスを気にしない場合は、ファイルに追加することでいつでもアプリを制限でき<uses-sdk android:minSdkVersion="13" />ますAndroidManifest.xml

回避策が必要なバージョンでプログラムが実行されているかどうかを確認するには、次を使用します。

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only version older than gingerbread
}
于 2013-08-25T23:44:39.667 に答える