Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android FileOutputStream.write:获取java.io.IOException:数学结果不可表示_Android_Math_Ioexception - Fatal编程技术网

Android FileOutputStream.write:获取java.io.IOException:数学结果不可表示

Android FileOutputStream.write:获取java.io.IOException:数学结果不可表示,android,math,ioexception,Android,Math,Ioexception,我在我的in the wild server错误日志中得到了一个“有趣”的异常。我的应用程序将异常和“wtf”-错误发布到我的中央服务器,所以我没有太多关于到底发生了什么的信息。我只知道这件事发生了,我没有任何线索 堆栈跟踪: java.io.IOException:数学结果不可表示 位于org.apache.harmony.luni.platform.OSFileSystem.writeImpl(本机方法) 位于org.apache.harmony.luni.platform.OSFileS

我在我的in the wild server错误日志中得到了一个“有趣”的异常。我的应用程序将异常和“wtf”-错误发布到我的中央服务器,所以我没有太多关于到底发生了什么的信息。我只知道这件事发生了,我没有任何线索

堆栈跟踪:


java.io.IOException:数学结果不可表示
位于org.apache.harmony.luni.platform.OSFileSystem.writeImpl(本机方法)
位于org.apache.harmony.luni.platform.OSFileSystem.write(OSFileSystem.java:129)
在java.io.FileOutputStream.write(FileOutputStream.java:297)中
在net.jav.apps.romeolive.RomeoInterface.fetchBinaryToFile(RomeoInterface.java:299)
位于net.jav.apps.romeolive.HeartBeatService$\u fetchPic.run(HeartBeatService.java:327)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
运行(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);

“失败”行是os.write()

fetchBinary(url)从web服务器获取一些二进制文件(缩略图jpg),并将其作为字节[]返回,如果未找到,则返回NULL/错误

getCacheFileName(type,fullurl)返回cacheDir()加上type加上经过清理的fullurl(删除斜杠,仅使用url的localpart)

所以,真正失败的是。。。正在尝试将现有缩略图jpg字节[]写入cacheDir()中精心编制的文件名

出现此异常的设备(到目前为止只有一次)为:GT-I9000@samsung/GT-I9000/GT-I9000/GT-I9000:2.2.1/FROYO/XXJPY:用户/释放键

有人把这个“数学结果不可表示”作为例外吗? 我真的很想把那件事搞清楚;)谷歌和Stackoverflow没有显示出任何有用甚至相关的东西

非常感谢,
Oliver

在我看来,这可能不是您代码中的错误,但我不能确定这一点

字符串“Math result not representable”(数学结果不可表示)在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;
}

因此,写入过程中的任何随机系统错误都会作为IOException(包括Erage)渗透回Java。但我看不出哪里会发生射程误差;未将ERANGE列为其可能的错误代码之一

我找到了另一个要写的手册页(2),其中列出了Erage;)->ERANGE fd指的是一个流,要写入的总字节数超出最小和最大写入范围,最小值为非零。。。对我来说仍然没有任何意义…再次阅读我的评论。。。让我觉得。。。“最小值为非零”。。。我是否尝试写入0字节(服务器确实向我发送了0字节)?我要试试在那种情况下会发生什么。。。请不要尝试例外:-(我认为将计数值0传递到write()是合法的。作为检查文件状态的一种方式,这是有意义的。从手册页(其中一个,无论如何:-)中可以看到):“如果count为零,fd指的是常规文件,则write()如果检测到以下错误之一,则可能返回失败状态。如果未检测到任何错误,则将返回0而不会造成任何其他影响。如果计数为零且fd引用的文件不是常规文件,则不会指定结果。“此外,如果您正在写入文件,则您没有写入流。”(在Unix意义上,而不是Java意义上),因此对ERANGE的描述在这里似乎不适用。感谢您的努力和评论。我想我只会把这件事放在“wtf android在这里做了什么?”类别中,不再考虑它了;)