Android FileOutputStream.write: получил java.io.IOException: математический результат не может быть представлен - PullRequest
2 голосов
/ 24 января 2011

Я получил это "интересное" исключение в моем логе ошибок сервера. Мое приложение отправляет исключения и ошибки "wtf" на мой центральный сервер, поэтому у меня нет большой информации о том, что точно произошло. Я просто знаю, что это произошло, и я понятия не имею.

StackTrace:

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:

</p> <pre><code> 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) извлекает некоторый двоичный файл (миниатюру jpg) с веб-сервера и возвращает его в виде байта [], или NULL, если не найден / ошибка.

getCacheFileName (type, fullurl) возвращает cacheDir () плюс тип плюс очищенный fullurl (удаляя косую черту, используйте только локальную часть url).

Итак, что именно не получается, так это ... Попытка записать существующий эскиз jpg byte [] в идеально созданное имя файла в cacheDir ().

Устройство, на котором это исключение появилось (ONCE только до сих пор): GT-I9000 @ samsung / GT-I9000 / GT-I9000 / GT-I9000: 2.2.1 / FROYO / XXJPY: пользовательские / клавиши разблокировки

Кто-нибудь имел этот "Математический результат не может быть представлен" как IOException? Я бы очень хотел прибить эту штуку;) Google и Stackoverflow не обнаружили ничего полезного или даже связанного.

Большое спасибо, Оливер

1 Ответ

1 голос
/ 24 января 2011

Мне не кажется, что это может быть ошибкой в ​​вашем коде, но я не уверен в этом.

Строка «Математический результат не представлен» отображается в поиске Google как связанная с ERRNO 34 (ERANGE), которая также представлена ​​строкой «Численный результат вне диапазона».

Источник для 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;
}

Таким образом, любая случайная системная ошибка во время записи будет перенаправлена ​​обратно в Java как IOException, включая ERANGE. Но я не вижу, где могла произойти ошибка диапазона; справочная страница для write (2) не перечисляет ERANGE как один из возможных кодов ошибок.

...