2011-01-23 2 views
2

내 in-the-wild 서버 오류 로그에서 "재미있는"예외가 발생했습니다. 내 응용 프로그램의 예외 및 "wtf"오류가 내 중앙 서버에 게시되므로 많은 정보가 없습니다. 정확히 happend. 나는 그것이 일어난다는 것을 알고 있으며, 나는 단서가 없다.Android FileOutputStream.write : got java.io.IOException : 수학 결과를 표현할 수 없음

스택 트레이스 : net.jav.apps.romeolive.RomeoInterface 대신

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)

코드 :

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)을 가져 와서 byte [] 또는 찾지 못하면 NULL을 반환합니다.

getCacheFileName (type, fullurl)은 cacheDir() 더하기 유형과 새 니타 이징 된 fullurl을 반환합니다 (슬래시를 제거하고 URL의 localpart 만 사용하십시오).

정확히 무엇이 실패할까요? 기존 썸네일 jpg byte []를 cacheDir()의 완벽하게 조작 된 파일 이름에 쓰려고합니다.

이 예외가 발생한 장치는 다음과 같습니다 (GT-I9000/samsung/GT-I9000/GT-I9000/GT-I9000 : 2.2.1/FROYO/XXJPY : 사용자/릴리스 키

"수학 결과를 IOException으로 표현할 수 없습니까?" 나는 그 일을 제대로 처리하고 싶다;) Google과 Stackoverflow는 도움이되거나 심지어 관련있는 것을 보여주지 못했다.

고마워, 올리버

답변

1

그것은 당신의 코드에서 버그가 수 나를 이렇게하지 않는 것,하지만 난 그 확신 할 수 없다.

"수학 결과를 나타낼 수 없음"이라는 문자열은 "숫자 결과가 범위를 벗어남"문자열로 표시되는 ERRNO 34 (ERANGE)와 관련된 것으로 Google 검색에 표시됩니다.

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; 
} 

그래서 쓰기 중에 무작위 시스템 오류가 ERANGE 포함, IOException가 자바에 백업을 관류한다. 그러나 나는 범위 에러가 일어난 곳을 볼 수 없다. man page for write(2)은 가능한 오류 코드 중 하나로 ERANGE를 나열하지 않습니다.

+1

가 I (2) ERANGE 나열시킨 쓰는 다른 맨 발견) -> ERANGE의 FD가 스트림을 지칭 기록 할 바이트의 총수 는 최소 및 최대 기록 범위 밖이며, 최소값은 0이 아닙니다. ... 아직 나에게 어떤 의미가 있는지 ... – Oliver

+1

내 의견을 다시 읽고 ... 나를 생각하게한다 ... "최소값은 0이 아니다"... 0 바이트 (서버를 정말로 쓰려고 했습니까? 나에게 0 바이트를 보냈다)? 그 경우 일어날 일을 시도 할거야 ... * try * 예외 :-( – Oliver

+1

write()에 0의 카운트 값을 전달하는 것이 합법적이라고 생각한다. 파일 상태를 검사하는 방법으로 생각된다. .맨 페이지에서 (그들 중 하나, 어쨌든 :-) : "count가 0이고 fd가 일반 파일을 참조하면, write()는 아래 오류 중 하나가 감지되면 실패 상태를 반환 할 수 있습니다. count가 0이고 fd가 일반 파일이 아닌 파일을 참조하면 결과가 지정되지 않습니다. " –

관련 문제