2

その「興味深い」例外が、実際のサーバーのエラーログで発生しました。私のアプリは例外と「wtf」エラーを中央サーバーに送信するため、正確に何が起こったのかについて多くの情報がありません。私はそれが起こったことを知っているだけで、手がかりはありません。

スタックトレース:

java.io.IOException: Math result not representable at org.apache.harmony.luni.platform.OSFileSystem.writeImpl(Native Method) at org.apache.harmony.luni.platform.OSFileSystem.write(OSFileSystem.java:129) at java.io.FileOutputStream.write(FileOutputStream.java:297) at net.jav.apps.romeolive.RomeoInterface.fetchBinaryToFile(RomeoInterface.java:299) at net.jav.apps.romeolive.HeartBeatService$_fetchPic.run(HeartBeatService.java:327) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) at java.lang.Thread.run(Thread.java:1096)

net.jav.apps.romeolive.RomeoInterfaceの代わりのコード:

    byte[] ret=fetchBinary(fullurl);

    if (ret==null) return false;

    try 
    {
        FileOutputStream os=new FileOutputStream(getCacheFileName(type,fullurl));
        os.write(ret, 0, ret.length);

「失敗した」行#299はos.write()です

fetchBinary(url)は、Webサーバーからバイナリファイル(サムネイルjpg)をフェッチし、それをbyte []として返すか、見つからない/エラーの場合はNULLを返します。

getCacheFileName(type、fullurl)は、cacheDir()とタイプに加えてサニタイズされたフルURLを返します(スラッシュを削除し、URLのローカル部分のみを使用します)。

つまり、正確に失敗するのは...既存のサムネイルjpg byte []をcacheDir()で完全に細工されたファイル名に書き込もうとしています。

この例外が発生したデバイス(これまでに1回のみ)は、GT-I9000 @ samsung / GT-I9000 / GT-I9000 / GT-I9000:2.2.1 / FROYO / XXJPY:user/release-keysです。

誰かがこの「数学の結果を表現できない」をIOExceptionとして持っていましたか?私は本当にそのことを突き止めたいです;)グーグルとStackoverflowは有用なものも関連するものも何も表示しませんでした。

どうもありがとう、オリバー

4

1 に答える 1

1

これがあなたのコードのバグであるとは思えませんが、私には確信が持てません。

文字列「Math result not presentable」は、文字列「Numerical result out of range」でも表される ERRNO 34 (ERANGE) に関連付けられているものとして Google 検索に表示されます。

org.apache.harmony.luni.platform.OSFileSystem.writeImplのソースは次のとおりです。

static jlong harmony_io_writeImpl(JNIEnv* env, jobject, jint fd,
        jbyteArray byteArray, jint offset, jint nbytes) {

    jbyte* bytes = env->GetByteArrayElements(byteArray, NULL);
    jlong result = TEMP_FAILURE_RETRY(write(fd, bytes + offset, nbytes));
    env->ReleaseByteArrayElements(byteArray, bytes, JNI_ABORT);

    if (result == -1) {
        if (errno == EAGAIN) {
            jniThrowException(env, "java/io/InterruptedIOException",
                    "Write timed out");
        } else {
            jniThrowIOException(env, errno);
        }
    }
    return result;
}

そのため、書き込み中のランダムなシステム エラーは、ERANGE を含む IOException として Java に戻ります。しかし、範囲エラーが発生した可能性がある場所はわかりません。write(2)のマニュアル ページには、考えられるエラー コードの 1 つとして ERANGE が記載されていません。

于 2011-01-23T23:21:18.317 に答える