1

このコードにいくつかのエラーがあります:

エラー(18,40):報告されていない例外java.io.FileNotFoundException; キャッチするか、スローするように宣言する必要がありますError(19,42):報告されていない例外java.io.IOException; 捕まえるか、投げられると宣言する必要があります

ただし、FileNotFoundおよびIOException例外がスローされると、コンパイラは次のエラーを表示します。

エラー(15,27):のremoveEldestEntry(java.util.Map.Entry)は、java.util.LinkedHashMapのremoveEldestEntry(java.util.Map.Entry)をオーバーライドできません。オーバーライドされたメソッドはjava.io.IOExceptionをスローしません

どうしたの?コードはここにあります:

package client;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.util.*;


public class level1 {


private static final int max_cache = 50;

private Map cache = new LinkedHashMap(max_cache, .75F, true) {
    protected boolean removeEldestEntry(Map.Entry eldest)  {
        boolean removed = super.removeEldestEntry(eldest);
        if (removed) {
            FileOutputStream fos = new FileOutputStream("t.tmp");
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            oos.writeObject(eldest.getValue());

            oos.close();
        }
        return removed;
    }

};


public level1() {
    for (int i = 1; i < 52; i++) {
        String string = String.valueOf(i);
        cache.put(string, string);
        System.out.println("\rCache size = " + cache.size() +
                           "\tRecent value = " + i + " \tLast value = " +
                           cache.get(string) + "\tValues in cache=" +
                           cache.values());

    }

}
4

2 に答える 2

3

これを試して..

package client;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.LinkedHashMap;
import java.util.Map;

public class Level1 {

    private static final int max_cache = 50;
    private Map cache = new LinkedHashMap(max_cache, .75F, true) {

        @Override
        protected boolean removeEldestEntry(Map.Entry eldest) {
            boolean removed = super.removeEldestEntry(eldest);
            if (removed) {
                FileOutputStream fos;
                try {
                    fos = new FileOutputStream("t.tmp");

                    ObjectOutputStream oos = new ObjectOutputStream(fos);

                    oos.writeObject(eldest.getValue());

                    oos.close();

                } catch (IOException ex) {
                    System.err.println("IOException!!");
                } catch (FileNotFoundException ex) {
                    System.err.println("FileNotFoundException!!");
                }
            }
            return removed;
        }
    };

    public level1() {
        for (int i = 1; i < 52; i++) {
            String string = String.valueOf(i);
            cache.put(string, string);
            System.out.println("\rCache size = " + cache.size()
                    + "\tRecent value = " + i + " \tLast value = "
                    + cache.get(string) + "\tValues in cache="
                    + cache.values());

        }

    }
}
于 2012-07-03T05:44:12.143 に答える
1

removeEldestEntryメソッド内でFileNotFoundExceptionを処理する必要があります(のように処理し、キャッチしてログに記録します)。メソッドをオーバーライドするときに、メソッドシグネチャに新しい例外を追加することはできません。これは、サブクラスがサブクラス化するものの代わりに使用できなくなるためです。

それ以外の場合は、removeEldestEntryがエントリをキューに入れ、他の何かがキューを読み取ってファイルへのシリアル化を行うように、別の方法を見つけます。実際、Javadocを読んだ後は、このロジックを配置するためのより良い場所が必要であるように思われます。実際に削除を実行する同じコードが、シリアル化を行うためのより良い場所である可能性があります。

于 2011-01-27T14:22:23.727 に答える