その「興味深い」例外が、実際のサーバーのエラーログで発生しました。私のアプリは例外と「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は有用なものも関連するものも何も表示しませんでした。
どうもありがとう、オリバー