通常、コードブロックは完全に機能します。しかし、非常にまれに「new ArrayList」がExeptionをスローしますmy.namespace.CacheEntryをjava.lang.Object []の配列に格納することはできません。ArrayListの作成:(いくつかのオブジェクト)はjava.lang.Object型の配列に格納できません[
Googleをチェックすると、誰かがAcer A500 3.1(これは私が持っているデバイス)でもこの例外が発生しているようです。私はジェネリックJavaなどで何のヒットも見られないので、Honeycombの特別なケースか、あるいはVMのバグですらあるかもしれません。
private long expireCache(HashMap<String, CacheEntry> map) {
long count = 0;
// next line will sometimes throw the exception:
ArrayList<CacheEntry> entries = new ArrayList<CacheEntry>(map.values());
Collections.sort(entries);
CacheEntryクラスは、あまりにも、非常に規則的である:
final class CacheEntry implements Comparable<CacheEntry> {
public File file;
public Long time;
CacheEntry(File cacheFile) {
// retreive the lastModified only once, don't do heavy I/O for sorting,
// keep it desynced from filesystem so nothing bad happens when the
// file gets changed while sorting:
file = cacheFile;
time = cacheFile.lastModified();
}
// "touch" the cached last modified time
public void touch() {
time = System.currentTimeMillis();
}
// return the long comparable of last modified time
public int compareTo(CacheEntry c) {
return time.compareTo(c.time);
}
}
私はこのコードで間違って何も表示されません。誰でも?
どのようにexpireCacheを呼び出すのですか?例を挙げてください。 – Alexandr
あなたのコードは正しいようですが、ハニカムのバグのようです。 – Guillaume
@Alexandr、私はこの問題が完全に問題ではないと思います。しかし、あなたが本当に知る必要があるのであれば、キャッシュのサイズまたはマップ内の要素の数がa以上であるとき、syncronized(cacheentry-hashmap)エントリ内からハッシュマップのすべての変更が同期されて呼び出されますハイウォーターマーク。 – Oliver