我在我的野外服务器错误日志中遇到了“有趣”的异常。我的应用程序将异常和“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);
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()plus类型加上已清理的fullurl(删除斜杠,仅使用url的localpart)。
那究竟是什么失败,是......试图将现有的缩略图jpg byte []写入cacheDir()中精心设计的文件名。
出现此异常的设备(仅限ONCE):GT-I9000 @ samsung / GT-I9000 / GT-I9000 / GT-I9000:2.2.1 / FROYO / XXJPY:用户/释放键< / p>
有没有人将此“数学结果无法表示”作为IOException? 我真的很想确定那件事;)谷歌和Stackoverflow没有显示任何有用甚至相关的内容。
非常感谢, 奥利弗
答案 0 :(得分:1)
在我看来,这可能不是您的代码中的错误,但我无法确定。
字符串“数学结果不可表示”在Google搜索中显示为与ERRNO 34(ERANGE)相关联,ERRNO 34也用字符串“数值结果超出范围”表示。
org.apache.harmony.luni.platform.OSFileSystem.writeImpl的source是:
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渗透回Java,包括ERANGE。但我不知道范围错误可能发生在哪里; man page for write(2)未将ERANGE列为其可能的错误代码之一。